From c2b5291a746f153e58eb27470c53844c01b47baa Mon Sep 17 00:00:00 2001 From: Josep Piguillem Date: Sun, 26 Jul 2026 01:02:41 +0200 Subject: [PATCH] Initial commit: OAuth IAM Laravel application Laravel-based OAuth/IAM service with Passport, Vue 3 frontend, and Docker Compose setup for local and production deployment. Co-Authored-By: Claude Sonnet 5 --- .dockerignore | 28 + .editorconfig | 18 + .env.example | 65 + .env.production.example | 46 + .gitattributes | 11 + .gitignore | 28 + .npmrc | 2 + Dockerfile | 76 + README.md | 58 + .../Controllers/Admin/AnalyticsController.php | 17 + app/Http/Controllers/Admin/AppController.php | 20 + app/Http/Controllers/Admin/UserController.php | 198 + .../Controllers/Api/AnalyticsController.php | 43 + app/Http/Controllers/Api/AppController.php | 41 + .../Api/AuthorizedAppController.php | 71 + app/Http/Controllers/Api/ClientController.php | 170 + .../Api/PersonalAccessTokenController.php | 106 + app/Http/Controllers/Api/UserController.php | 490 + app/Http/Controllers/Auth/AuthController.php | 141 + app/Http/Controllers/Controller.php | 55 + .../OAuth/AuthorizedAppController.php | 36 + .../Controllers/OAuth/ClientController.php | 97 + .../OAuth/PersonalAccessTokenController.php | 51 + app/Http/Middleware/SetLocale.php | 22 + app/Listeners/RecordOAuthLoginEvent.php | 31 + app/Models/LoginEvent.php | 24 + app/Models/User.php | 43 + app/Providers/AppServiceProvider.php | 50 + app/Support/AnalyticsSummary.php | 103 + artisan | 18 + bootstrap/app.php | 23 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 7 + composer.json | 90 + composer.lock | 11822 ++++++++++++++++ config/app.php | 126 + config/auth.php | 122 + config/cache.php | 136 + config/database.php | 184 + config/filesystems.php | 80 + config/l5-swagger.php | 333 + config/logging.php | 132 + config/mail.php | 118 + config/passport.php | 48 + config/permission.php | 219 + config/queue.php | 129 + config/services.php | 38 + config/session.php | 233 + database/.gitignore | 1 + database/factories/UserFactory.php | 45 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 59 + ...4_225144_create_oauth_auth_codes_table.php | 39 + ...25145_create_oauth_access_tokens_table.php | 41 + ...5146_create_oauth_refresh_tokens_table.php | 37 + ...7_24_225147_create_oauth_clients_table.php | 42 + ...225148_create_oauth_device_codes_table.php | 42 + ..._07_24_233201_create_permission_tables.php | 137 + ...24_233203_add_is_active_to_users_table.php | 28 + ..._25_085110_create_app_user_roles_table.php | 32 + ...07_25_100506_create_login_events_table.php | 35 + ...5_114228_add_deleted_at_to_users_table.php | 28 + ..._190704_add_approved_at_to_users_table.php | 37 + database/seeders/DatabaseSeeder.php | 170 + .../seeders/RolesAndPermissionsSeeder.php | 27 + docker-compose.prod.yml | 102 + docker/nginx/default.conf | 68 + docker/php/entrypoint.sh | 24 + docker/php/opcache.ini | 7 + docker/php/production.ini | 8 + docs/despliegue.md | 108 + docs/integracion-iam.html | 602 + docs/integracion-iam.pdf | Bin 0 -> 351905 bytes docs/manual-usuario.html | 620 + docs/manual-usuario.pdf | Bin 0 -> 496612 bytes lang/ca.json | 229 + lang/ca/actions.php | 119 + lang/ca/auth.php | 9 + lang/ca/http-statuses.php | 84 + lang/ca/messages.php | 13 + lang/ca/pagination.php | 8 + lang/ca/passwords.php | 11 + lang/ca/validation.php | 289 + lang/en.json | 229 + lang/en/actions.php | 119 + lang/en/auth.php | 9 + lang/en/http-statuses.php | 84 + lang/en/messages.php | 13 + lang/en/pagination.php | 8 + lang/en/passwords.php | 11 + lang/en/validation.php | 289 + lang/es.json | 229 + lang/es/actions.php | 119 + lang/es/auth.php | 9 + lang/es/http-statuses.php | 84 + lang/es/messages.php | 13 + lang/es/pagination.php | 8 + lang/es/passwords.php | 11 + lang/es/validation.php | 289 + package-lock.json | 2944 ++++ package.json | 28 + phpunit.xml | 36 + public/.htaccess | 25 + public/favicon.ico | 0 public/index.php | 20 + public/robots.txt | 2 + resources/js/App.vue | 107 + resources/js/app.ts | 13 + resources/js/bootstrap.ts | 13 + resources/js/components/charts/BarList.vue | 45 + .../js/components/charts/DailyLoginsChart.vue | 328 + resources/js/components/charts/StatTile.vue | 15 + resources/js/composables/useTheme.ts | 16 + resources/js/i18n/ca.ts | 209 + resources/js/i18n/en.ts | 209 + resources/js/i18n/es.ts | 208 + resources/js/i18n/index.ts | 20 + resources/js/pages/Authorize.vue | 70 + resources/js/pages/AuthorizedApps.vue | 67 + resources/js/pages/Clients.vue | 184 + resources/js/pages/Dashboard.vue | 72 + resources/js/pages/Login.vue | 69 + resources/js/pages/Register.vue | 103 + resources/js/pages/Tokens.vue | 145 + resources/js/pages/admin/Analytics.vue | 179 + resources/js/pages/admin/Users.vue | 567 + resources/js/router/index.ts | 96 + resources/js/stores/auth.ts | 91 + resources/js/types/models.ts | 90 + resources/js/vite-env.d.ts | 13 + resources/scss/abstracts/_mixins.scss | 35 + resources/scss/abstracts/_variables.scss | 32 + resources/scss/app.scss | 18 + resources/scss/base/_reset.scss | 50 + resources/scss/base/_tokens.scss | 70 + resources/scss/base/_typography.scss | 26 + resources/scss/components/_app-nav.scss | 131 + resources/scss/components/_auth-card.scss | 130 + resources/scss/components/_badge.scss | 24 + resources/scss/components/_banner.scss | 36 + resources/scss/components/_bar-list.scss | 68 + resources/scss/components/_button.scss | 107 + resources/scss/components/_card.scss | 35 + resources/scss/components/_chip.scss | 21 + resources/scss/components/_field.scss | 80 + resources/scss/components/_link.scss | 28 + resources/scss/components/_page-header.scss | 20 + resources/scss/components/_pill-select.scss | 18 + resources/scss/components/_stat-tile.scss | 26 + resources/scss/components/_table.scss | 62 + resources/views/app.blade.php | 56 + resources/views/vendor/l5-swagger/.gitkeep | 0 .../views/vendor/l5-swagger/index.blade.php | 174 + routes/api.php | 44 + routes/console.php | 8 + routes/web.php | 74 + storage/api-docs/api-docs.json | 1133 ++ storage/app/.gitignore | 4 + storage/app/private/.gitignore | 2 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + tsconfig.json | 9 + tsconfig.node.json | 10 + vite.config.ts | 24 + 174 files changed, 29318 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .env.production.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app/Http/Controllers/Admin/AnalyticsController.php create mode 100644 app/Http/Controllers/Admin/AppController.php create mode 100644 app/Http/Controllers/Admin/UserController.php create mode 100644 app/Http/Controllers/Api/AnalyticsController.php create mode 100644 app/Http/Controllers/Api/AppController.php create mode 100644 app/Http/Controllers/Api/AuthorizedAppController.php create mode 100644 app/Http/Controllers/Api/ClientController.php create mode 100644 app/Http/Controllers/Api/PersonalAccessTokenController.php create mode 100644 app/Http/Controllers/Api/UserController.php create mode 100644 app/Http/Controllers/Auth/AuthController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/OAuth/AuthorizedAppController.php create mode 100644 app/Http/Controllers/OAuth/ClientController.php create mode 100644 app/Http/Controllers/OAuth/PersonalAccessTokenController.php create mode 100644 app/Http/Middleware/SetLocale.php create mode 100644 app/Listeners/RecordOAuthLoginEvent.php create mode 100644 app/Models/LoginEvent.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Support/AnalyticsSummary.php create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/l5-swagger.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/passport.php create mode 100644 config/permission.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2026_07_24_225144_create_oauth_auth_codes_table.php create mode 100644 database/migrations/2026_07_24_225145_create_oauth_access_tokens_table.php create mode 100644 database/migrations/2026_07_24_225146_create_oauth_refresh_tokens_table.php create mode 100644 database/migrations/2026_07_24_225147_create_oauth_clients_table.php create mode 100644 database/migrations/2026_07_24_225148_create_oauth_device_codes_table.php create mode 100644 database/migrations/2026_07_24_233201_create_permission_tables.php create mode 100644 database/migrations/2026_07_24_233203_add_is_active_to_users_table.php create mode 100644 database/migrations/2026_07_25_085110_create_app_user_roles_table.php create mode 100644 database/migrations/2026_07_25_100506_create_login_events_table.php create mode 100644 database/migrations/2026_07_25_114228_add_deleted_at_to_users_table.php create mode 100644 database/migrations/2026_07_25_190704_add_approved_at_to_users_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/RolesAndPermissionsSeeder.php create mode 100644 docker-compose.prod.yml create mode 100644 docker/nginx/default.conf create mode 100644 docker/php/entrypoint.sh create mode 100644 docker/php/opcache.ini create mode 100644 docker/php/production.ini create mode 100644 docs/despliegue.md create mode 100644 docs/integracion-iam.html create mode 100644 docs/integracion-iam.pdf create mode 100644 docs/manual-usuario.html create mode 100644 docs/manual-usuario.pdf create mode 100644 lang/ca.json create mode 100644 lang/ca/actions.php create mode 100644 lang/ca/auth.php create mode 100644 lang/ca/http-statuses.php create mode 100644 lang/ca/messages.php create mode 100644 lang/ca/pagination.php create mode 100644 lang/ca/passwords.php create mode 100644 lang/ca/validation.php create mode 100644 lang/en.json create mode 100644 lang/en/actions.php create mode 100644 lang/en/auth.php create mode 100644 lang/en/http-statuses.php create mode 100644 lang/en/messages.php create mode 100644 lang/en/pagination.php create mode 100644 lang/en/passwords.php create mode 100644 lang/en/validation.php create mode 100644 lang/es.json create mode 100644 lang/es/actions.php create mode 100644 lang/es/auth.php create mode 100644 lang/es/http-statuses.php create mode 100644 lang/es/messages.php create mode 100644 lang/es/pagination.php create mode 100644 lang/es/passwords.php create mode 100644 lang/es/validation.php create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/js/App.vue create mode 100644 resources/js/app.ts create mode 100644 resources/js/bootstrap.ts create mode 100644 resources/js/components/charts/BarList.vue create mode 100644 resources/js/components/charts/DailyLoginsChart.vue create mode 100644 resources/js/components/charts/StatTile.vue create mode 100644 resources/js/composables/useTheme.ts create mode 100644 resources/js/i18n/ca.ts create mode 100644 resources/js/i18n/en.ts create mode 100644 resources/js/i18n/es.ts create mode 100644 resources/js/i18n/index.ts create mode 100644 resources/js/pages/Authorize.vue create mode 100644 resources/js/pages/AuthorizedApps.vue create mode 100644 resources/js/pages/Clients.vue create mode 100644 resources/js/pages/Dashboard.vue create mode 100644 resources/js/pages/Login.vue create mode 100644 resources/js/pages/Register.vue create mode 100644 resources/js/pages/Tokens.vue create mode 100644 resources/js/pages/admin/Analytics.vue create mode 100644 resources/js/pages/admin/Users.vue create mode 100644 resources/js/router/index.ts create mode 100644 resources/js/stores/auth.ts create mode 100644 resources/js/types/models.ts create mode 100644 resources/js/vite-env.d.ts create mode 100644 resources/scss/abstracts/_mixins.scss create mode 100644 resources/scss/abstracts/_variables.scss create mode 100644 resources/scss/app.scss create mode 100644 resources/scss/base/_reset.scss create mode 100644 resources/scss/base/_tokens.scss create mode 100644 resources/scss/base/_typography.scss create mode 100644 resources/scss/components/_app-nav.scss create mode 100644 resources/scss/components/_auth-card.scss create mode 100644 resources/scss/components/_badge.scss create mode 100644 resources/scss/components/_banner.scss create mode 100644 resources/scss/components/_bar-list.scss create mode 100644 resources/scss/components/_button.scss create mode 100644 resources/scss/components/_card.scss create mode 100644 resources/scss/components/_chip.scss create mode 100644 resources/scss/components/_field.scss create mode 100644 resources/scss/components/_link.scss create mode 100644 resources/scss/components/_page-header.scss create mode 100644 resources/scss/components/_pill-select.scss create mode 100644 resources/scss/components/_stat-tile.scss create mode 100644 resources/scss/components/_table.scss create mode 100644 resources/views/app.blade.php create mode 100644 resources/views/vendor/l5-swagger/.gitkeep create mode 100644 resources/views/vendor/l5-swagger/index.blade.php create mode 100644 routes/api.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/api-docs/api-docs.json create mode 100644 storage/app/.gitignore create mode 100644 storage/app/private/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4d94a73 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,28 @@ +.git +.gitignore +.env +.env.* +!.env.production.example +node_modules +vendor +public/build +public/hot +public/storage +storage/*.key +storage/api-docs +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/testing/* +storage/framework/views/* +storage/logs/* +storage/pail +docs/*.pdf +bootstrap/cache/*.php +tests +.phpunit.cache +.phpunit.result.cache +.idea +.vscode +.DS_Store +Dockerfile +docker-compose*.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6df8428 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[{compose,docker-compose}.{yml,yaml}] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c0660ea --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +# PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.env.production.example b/.env.production.example new file mode 100644 index 0000000..4e652f0 --- /dev/null +++ b/.env.production.example @@ -0,0 +1,46 @@ +APP_NAME="IAM" +APP_ENV=production +APP_KEY= +APP_DEBUG=false +APP_URL=https://tu-dominio.com + +APP_LOCALE=es +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=es_ES + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_LEVEL=warning + +# --- Base de datos (PostgreSQL, servicio "db" del docker-compose) --- +DB_CONNECTION=pgsql +DB_HOST=db +DB_PORT=5432 +DB_DATABASE=oauth_iam +DB_USERNAME=oauth_iam +DB_PASSWORD= + +# --- Sesión / cache / colas (Redis, servicio "redis") --- +SESSION_DRIVER=redis +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_SECURE_COOKIE=true +SESSION_DOMAIN=.tu-dominio.com + +CACHE_STORE=redis +QUEUE_CONNECTION=redis + +REDIS_CLIENT=phpredis +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD=null + +FILESYSTEM_DISK=local + +MAIL_MAILER=log +MAIL_FROM_ADDRESS="no-reply@tu-dominio.com" +MAIL_FROM_NAME="${APP_NAME}" + +L5_SWAGGER_GENERATE_ALWAYS=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df1790d --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +*.log +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +/.claude/ +/.codex +/.cursor/ +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/fonts-manifest.dev.json +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +_ide_helper.php +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..495a6af --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +ignore-scripts=true +audit=true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..df5d1c3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,76 @@ +# syntax=docker/dockerfile:1 + +# +# ---- 1. Frontend build (Vite: Vue + TS + SCSS) ---- +# +FROM node:20-alpine AS frontend +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci +COPY resources/ resources/ +COPY vite.config.ts tsconfig.json tsconfig.node.json ./ +RUN npm run build + +# +# ---- 2. PHP dependencies (no dev, no scripts — no app code/DB available yet) ---- +# +FROM composer:2 AS vendor +WORKDIR /app +COPY composer.json composer.lock ./ +RUN composer install \ + --no-dev \ + --no-scripts \ + --no-interaction \ + --no-progress \ + --prefer-dist \ + --optimize-autoloader + +# +# ---- 3. Application image (PHP-FPM) ---- +# +FROM php:8.4-fpm-alpine AS app + +RUN apk add --no-cache \ + postgresql-libs \ + icu-libs \ + oniguruma \ + libzip \ + su-exec \ + && apk add --no-cache --virtual .build-deps \ + postgresql-dev \ + icu-dev \ + oniguruma-dev \ + libzip-dev \ + linux-headers \ + $PHPIZE_DEPS \ + && docker-php-ext-install -j$(nproc) pdo pdo_pgsql bcmath intl zip pcntl opcache \ + && pecl install redis \ + && docker-php-ext-enable redis \ + && apk del .build-deps + +COPY docker/php/production.ini /usr/local/etc/php/conf.d/zz-production.ini +COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/zz-opcache.ini + +WORKDIR /var/www/html + +COPY --from=vendor /app/vendor vendor/ +COPY . . +COPY --from=frontend /app/public/build public/build + +RUN php artisan package:discover --ansi + +RUN chown -R www-data:www-data storage bootstrap/cache \ + && chmod -R 775 storage bootstrap/cache + +COPY docker/php/entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +ENTRYPOINT ["entrypoint.sh"] +CMD ["php-fpm"] + +# +# ---- 4. Nginx (static assets + reverse proxy to php-fpm) ---- +# +FROM nginx:1.27-alpine AS nginx +COPY --from=frontend /app/public /var/www/html/public +COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ad1377 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. + +In addition, [Laracasts](https://laracasts.com) contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +You can also watch bite-sized lessons with real-world projects on [Laravel Learn](https://laravel.com/learn), where you will be guided through building a Laravel application from scratch while learning PHP fundamentals. + +## Agentic Development + +Laravel's predictable structure and conventions make it ideal for AI coding agents like Claude Code, Cursor, and GitHub Copilot. Install [Laravel Boost](https://laravel.com/docs/ai) to supercharge your AI workflow: + +```bash +composer require laravel/boost --dev + +php artisan boost:install +``` + +Boost provides your agent 15+ tools and skills that help agents build Laravel applications while following best practices. + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Http/Controllers/Admin/AnalyticsController.php b/app/Http/Controllers/Admin/AnalyticsController.php new file mode 100644 index 0000000..0cfd964 --- /dev/null +++ b/app/Http/Controllers/Admin/AnalyticsController.php @@ -0,0 +1,17 @@ +integer('days', 30), 7), 90); + + return response()->json(AnalyticsSummary::build($days)); + } +} diff --git a/app/Http/Controllers/Admin/AppController.php b/app/Http/Controllers/Admin/AppController.php new file mode 100644 index 0000000..a8c5672 --- /dev/null +++ b/app/Http/Controllers/Admin/AppController.php @@ -0,0 +1,20 @@ +json( + Client::query()->where('revoked', false)->orderBy('name')->get(['id', 'name']) + ); + } +} diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php new file mode 100644 index 0000000..ed26264 --- /dev/null +++ b/app/Http/Controllers/Admin/UserController.php @@ -0,0 +1,198 @@ +json( + User::query()->whereNotNull('approved_at')->orderBy('name')->get()->map($this->present(...)) + ); + } + + /** + * Usuarios borrados (soft delete) — la "papelera". + */ + public function trashed() + { + return response()->json( + User::onlyTrashed()->orderByDesc('deleted_at')->get()->map($this->present(...)) + ); + } + + /** + * Usuarios que se autorregistraron y todavía no aprobó ningún admin. + */ + public function pending() + { + return response()->json( + User::query()->whereNull('approved_at')->orderBy('created_at')->get()->map($this->present(...)) + ); + } + + public function approve(User $user) + { + $user->update(['approved_at' => now()]); + + return response()->json($this->present($user)); + } + + public function store(Request $request) + { + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')], + 'password' => ['required', 'string', 'min:8'], + 'role' => ['required', Rule::in(Role::pluck('name'))], + ]); + + $user = User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + 'is_active' => true, + 'approved_at' => now(), // lo da de alta un admin: ya está aprobado. + ]); + + $user->assignRole($data['role']); + + return response()->json($this->present($user), 201); + } + + public function update(Request $request, User $user) + { + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')->ignore($user->id)], + 'password' => ['nullable', 'string', 'min:8'], + 'is_active' => ['boolean'], + 'role' => ['required', Rule::in(Role::pluck('name'))], + ]); + + if ($user->id === $request->user()->id && $data['role'] !== 'admin' && $user->hasRole('admin')) { + abort(422, __('messages.cannot_remove_own_admin_role')); + } + + $user->update([ + 'name' => $data['name'], + 'email' => $data['email'], + 'is_active' => $data['is_active'] ?? $user->is_active, + ...(isset($data['password']) ? ['password' => Hash::make($data['password'])] : []), + ]); + + $user->syncRoles([$data['role']]); + + return response()->json($this->present($user->fresh())); + } + + /** + * Soft delete: el usuario deja de aparecer en el sistema pero queda + * recuperable desde la papelera. + */ + public function destroy(Request $request, User $user) + { + abort_if($user->id === $request->user()->id, 422, __('messages.cannot_delete_self')); + + if ($user->hasRole('admin') && User::role('admin')->count() <= 1) { + abort(422, __('messages.cannot_delete_last_admin')); + } + + $user->delete(); + + return response()->noContent(); + } + + public function restore(int $id) + { + $user = User::onlyTrashed()->findOrFail($id); + $user->restore(); + + return response()->json($this->present($user)); + } + + /** + * Borrado definitivo — solo tiene sentido sobre alguien que ya está en la papelera. + */ + public function forceDelete(Request $request, int $id) + { + $user = User::onlyTrashed()->findOrFail($id); + + $user->forceDelete(); + + return response()->noContent(); + } + + /** + * Roles que este usuario tiene asignados en cada app (cliente OAuth), agrupados. + * Es un sistema aparte del rol global de spatie: vive en app_user_roles, + * no en las tablas de spatie (evita mezclar "quién administra este panel" + * con "qué rol tiene este usuario dentro de la app de un tercero"). + */ + public function appRoles(User $user) + { + $rows = DB::table('app_user_roles') + ->join('oauth_clients', 'oauth_clients.id', '=', 'app_user_roles.client_id') + ->where('app_user_roles.user_id', $user->id) + ->get(['oauth_clients.id as client_id', 'oauth_clients.name as client_name', 'app_user_roles.role']); + + return response()->json( + $rows->groupBy('client_id')->map(fn ($group) => [ + 'client_id' => $group->first()->client_id, + 'client_name' => $group->first()->client_name, + 'roles' => $group->pluck('role'), + ])->values() + ); + } + + public function assignAppRole(Request $request, User $user) + { + $data = $request->validate([ + 'client_id' => ['required', 'exists:oauth_clients,id'], + 'role' => ['required', Rule::in(Role::pluck('name'))], + ]); + + DB::table('app_user_roles')->insertOrIgnore([ + 'user_id' => $user->id, + 'client_id' => $data['client_id'], + 'role' => $data['role'], + 'created_at' => now(), + 'updated_at' => now(), + ]); + + return response()->json($data, 201); + } + + public function revokeAppRole(User $user, string $clientId, string $role) + { + DB::table('app_user_roles') + ->where('user_id', $user->id) + ->where('client_id', $clientId) + ->where('role', $role) + ->delete(); + + return response()->noContent(); + } + + private function present(User $user): array + { + return [ + 'id' => $user->id, + 'name' => $user->name, + 'email' => $user->email, + 'is_active' => $user->is_active, + 'roles' => $user->getRoleNames(), + 'created_at' => $user->created_at, + 'deleted_at' => $user->deleted_at, + 'approved_at' => $user->approved_at, + ]; + } +} diff --git a/app/Http/Controllers/Api/AnalyticsController.php b/app/Http/Controllers/Api/AnalyticsController.php new file mode 100644 index 0000000..c7e16cf --- /dev/null +++ b/app/Http/Controllers/Api/AnalyticsController.php @@ -0,0 +1,43 @@ + ['users:read']]], + tags: ['Analytics'], + parameters: [ + new OA\Parameter(name: 'days', in: 'query', required: false, description: 'Ventana en días (7-90, default 30)', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: 200, description: 'Resumen de analíticas'), + new OA\Response(response: 403, description: 'Sin permiso users.view'), + ] + )] + public function summary(Request $request) + { + $actor = $request->user('api'); + abort_if($actor && ! $actor->can('users.view'), 403); + + $days = min(max((int) $request->integer('days', 30), 7), 90); + + return response()->json(AnalyticsSummary::build($days)); + } +} diff --git a/app/Http/Controllers/Api/AppController.php b/app/Http/Controllers/Api/AppController.php new file mode 100644 index 0000000..ba454d3 --- /dev/null +++ b/app/Http/Controllers/Api/AppController.php @@ -0,0 +1,41 @@ + ['users:read']]], + tags: ['Users'], + responses: [ + new OA\Response(response: 200, description: 'Listado de apps'), + new OA\Response(response: 403, description: 'Sin permiso users.view'), + ] + )] + public function index(Request $request) + { + $actor = $request->user('api'); + + abort_if($actor && ! $actor->can('users.view'), 403); + + return response()->json( + Client::query()->where('revoked', false)->orderBy('name')->get(['id', 'name']) + ); + } +} diff --git a/app/Http/Controllers/Api/AuthorizedAppController.php b/app/Http/Controllers/Api/AuthorizedAppController.php new file mode 100644 index 0000000..9e28abb --- /dev/null +++ b/app/Http/Controllers/Api/AuthorizedAppController.php @@ -0,0 +1,71 @@ + ['account:read']]], + tags: ['Account'], + responses: [new OA\Response(response: 200, description: 'Listado de tokens/apps autorizadas')] + )] + public function index(Request $request) + { + $user = $this->requireUser($request); + + $tokens = $user->tokens() + ->where('revoked', false) + ->with('client') + ->get() + ->reject(fn ($token) => $token->client->revoked || $token->client->hasGrantType('personal_access')) + ->values(); + + return response()->json($tokens); + } + + #[OA\Delete( + path: '/authorized-apps/{tokenId}', + summary: 'Revocar el acceso de una app de terceros', + security: [['oauth2' => ['account:write']]], + tags: ['Account'], + parameters: [new OA\Parameter(name: 'tokenId', in: 'path', required: true, schema: new OA\Schema(type: 'string'))], + responses: [ + new OA\Response(response: 204, description: 'Acceso revocado'), + new OA\Response(response: 404, description: 'No existe o no es tuyo'), + ] + )] + public function destroy(Request $request, string $tokenId) + { + $token = $this->requireUser($request)->tokens()->where('id', $tokenId)->first(); + + abort_unless($token, 404); + + $token->revoke(); + $token->refreshToken?->revoke(); + + return response()->noContent(); + } + + private function requireUser(Request $request): User + { + return $request->user('api') ?? abort(422, __('messages.self_service_requires_user')); + } +} diff --git a/app/Http/Controllers/Api/ClientController.php b/app/Http/Controllers/Api/ClientController.php new file mode 100644 index 0000000..0f1d171 --- /dev/null +++ b/app/Http/Controllers/Api/ClientController.php @@ -0,0 +1,170 @@ + ['account:read']]], + tags: ['Account'], + responses: [ + new OA\Response(response: 200, description: 'Listado de clientes', content: new OA\JsonContent(type: 'array', items: new OA\Items(ref: '#/components/schemas/Client'))), + new OA\Response(response: 422, description: 'El token no tiene un usuario asociado (ej. client_credentials)'), + ] + )] + public function index(Request $request) + { + return response()->json( + $this->requireUser($request)->oauthApps()->where('revoked', false)->orderByDesc('created_at')->get() + ); + } + + #[OA\Post( + path: '/clients', + summary: 'Registrar un nuevo cliente OAuth (tu app)', + security: [['oauth2' => ['account:write']]], + tags: ['Account'], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + required: ['name', 'grant_type'], + properties: [ + new OA\Property(property: 'name', type: 'string'), + new OA\Property(property: 'grant_type', type: 'string', enum: ['authorization_code', 'client_credentials', 'password']), + new OA\Property(property: 'redirect_uris', type: 'array', items: new OA\Items(type: 'string')), + new OA\Property(property: 'confidential', type: 'boolean', default: true), + ] + ) + ), + responses: [ + new OA\Response(response: 201, description: 'Cliente creado (incluye plain_secret una sola vez)'), + new OA\Response(response: 422, description: 'Datos inválidos o token sin usuario asociado'), + ] + )] + public function store(Request $request) + { + $user = $this->requireUser($request); + + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'grant_type' => ['required', Rule::in(['authorization_code', 'client_credentials', 'password'])], + 'redirect_uris' => ['required_if:grant_type,authorization_code', 'array'], + 'redirect_uris.*' => ['url'], + 'confidential' => ['boolean'], + ]); + + $confidential = $request->boolean('confidential', true); + + $grantTypes = match ($data['grant_type']) { + 'authorization_code' => ['authorization_code', 'refresh_token'], + 'password' => ['password', 'refresh_token'], + 'client_credentials' => ['client_credentials'], + }; + + // client_credentials always needs a secret: there is no user present to prove identity. + if ($data['grant_type'] === 'client_credentials') { + $confidential = true; + } + + $client = $user->oauthApps()->create([ + 'name' => $data['name'], + 'secret' => $confidential ? Str::random(40) : null, + 'provider' => null, + 'redirect_uris' => $data['redirect_uris'] ?? [], + 'grant_types' => $grantTypes, + 'revoked' => false, + ]); + + return response()->json([ + 'client' => $client, + 'plain_secret' => $client->plainSecret, + ], 201); + } + + #[OA\Put( + path: '/clients/{client}', + summary: 'Editar uno de tus clientes OAuth', + security: [['oauth2' => ['account:write']]], + tags: ['Account'], + parameters: [new OA\Parameter(name: 'client', in: 'path', required: true, schema: new OA\Schema(type: 'string'))], + responses: [ + new OA\Response(response: 200, description: 'Cliente actualizado', content: new OA\JsonContent(ref: '#/components/schemas/Client')), + new OA\Response(response: 404, description: 'No es tuyo o no existe'), + ] + )] + public function update(Request $request, Client $client) + { + abort_unless($client->owner_id === $this->requireUser($request)->id, 404); + + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'redirect_uris' => ['array'], + 'redirect_uris.*' => ['url'], + ]); + + $client->update([ + 'name' => $data['name'], + 'redirect_uris' => $data['redirect_uris'] ?? $client->redirect_uris, + ]); + + return response()->json($client); + } + + #[OA\Delete( + path: '/clients/{client}', + summary: 'Revocar uno de tus clientes OAuth (y sus tokens)', + security: [['oauth2' => ['account:write']]], + tags: ['Account'], + parameters: [new OA\Parameter(name: 'client', in: 'path', required: true, schema: new OA\Schema(type: 'string'))], + responses: [ + new OA\Response(response: 204, description: 'Revocado'), + new OA\Response(response: 404, description: 'No es tuyo o no existe'), + ] + )] + public function destroy(Request $request, Client $client) + { + abort_unless($client->owner_id === $this->requireUser($request)->id, 404); + + $client->update(['revoked' => true]); + $client->tokens()->update(['revoked' => true]); + + return response()->noContent(); + } + + private function requireUser(Request $request): User + { + return $request->user('api') ?? abort(422, __('messages.self_service_requires_user')); + } +} diff --git a/app/Http/Controllers/Api/PersonalAccessTokenController.php b/app/Http/Controllers/Api/PersonalAccessTokenController.php new file mode 100644 index 0000000..9af9ed8 --- /dev/null +++ b/app/Http/Controllers/Api/PersonalAccessTokenController.php @@ -0,0 +1,106 @@ + ['account:read']]], + tags: ['Account'], + responses: [new OA\Response(response: 200, description: 'Listado de tokens')] + )] + public function index(Request $request) + { + return response()->json( + $this->requireUser($request)->tokens() + ->where('revoked', false) + ->whereHas('client', fn ($q) => $q->whereJsonContains('grant_types', 'personal_access')) + ->orderByDesc('created_at') + ->get(['id', 'name', 'scopes', 'created_at', 'expires_at']) + ); + } + + #[OA\Post( + path: '/personal-access-tokens', + summary: 'Crear un Personal Access Token (tipo API key)', + security: [['oauth2' => ['account:write']]], + tags: ['Account'], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + required: ['name'], + properties: [ + new OA\Property(property: 'name', type: 'string'), + new OA\Property(property: 'scopes', type: 'array', items: new OA\Items(type: 'string')), + ] + ) + ), + responses: [new OA\Response(response: 201, description: 'Token creado (access_token solo se muestra esta vez)')] + )] + public function store(Request $request) + { + $user = $this->requireUser($request); + + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'scopes' => ['array'], + 'scopes.*' => [Rule::in(Passport::scopeIds())], + ]); + + $result = $user->createToken($data['name'], $data['scopes'] ?? []); + + return response()->json([ + 'access_token' => $result->accessToken, + 'token' => $result->token, + ], 201); + } + + #[OA\Delete( + path: '/personal-access-tokens/{tokenId}', + summary: 'Revocar un Personal Access Token', + security: [['oauth2' => ['account:write']]], + tags: ['Account'], + parameters: [new OA\Parameter(name: 'tokenId', in: 'path', required: true, schema: new OA\Schema(type: 'string'))], + responses: [ + new OA\Response(response: 204, description: 'Revocado'), + new OA\Response(response: 404, description: 'No existe o no es tuyo'), + ] + )] + public function destroy(Request $request, string $tokenId) + { + /** @var Token|null $token */ + $token = $this->requireUser($request)->tokens()->where('id', $tokenId)->first(); + + abort_unless($token, 404); + + $token->revoke(); + + return response()->noContent(); + } + + private function requireUser(Request $request): User + { + return $request->user('api') ?? abort(422, __('messages.self_service_requires_user')); + } +} diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php new file mode 100644 index 0000000..fcfb95f --- /dev/null +++ b/app/Http/Controllers/Api/UserController.php @@ -0,0 +1,490 @@ + []]], + tags: ['Users'], + responses: [ + new OA\Response(response: 200, description: 'Usuario autenticado', content: new OA\JsonContent(ref: '#/components/schemas/User')), + new OA\Response(response: 401, description: 'Token inválido o sin usuario asociado (ej. client_credentials)'), + ] + )] + public function me(Request $request) + { + return response()->json($this->present($request->user())); + } + + #[OA\Get( + path: '/users', + summary: 'Listar usuarios', + description: 'Incluye usuarios pendientes de aprobación del panel admin (ver campo approved_at) — esa aprobación solo gobierna el acceso al panel de sesión de esta app, no la consulta de usuarios vía API.', + security: [['oauth2' => ['users:read']]], + tags: ['Users'], + responses: [ + new OA\Response(response: 200, description: 'Listado de usuarios', content: new OA\JsonContent(type: 'array', items: new OA\Items(ref: '#/components/schemas/User'))), + new OA\Response(response: 403, description: 'Sin permiso users.view'), + ] + )] + public function index(Request $request) + { + $this->authorize($request, 'users.view'); + + // A diferencia del panel admin (Admin\UserController), acá NO se + // esconden los usuarios pendientes de aprobación: "aprobado" es un + // concepto del panel de esta app (¿puede entrar a /admin?), no algo + // que le importe a otra app que solo está consultando/consumiendo + // usuarios por la API. + return response()->json( + User::query()->with('roles:id,name')->orderBy('name')->get()->map($this->present(...)) + ); + } + + #[OA\Post( + path: '/users', + summary: 'Crear un usuario', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + required: ['name', 'email', 'password'], + properties: [ + new OA\Property(property: 'name', type: 'string'), + new OA\Property(property: 'email', type: 'string', format: 'email'), + new OA\Property(property: 'password', type: 'string', format: 'password'), + new OA\Property(property: 'role', type: 'string', example: 'user'), + ] + ) + ), + responses: [ + new OA\Response(response: 201, description: 'Usuario creado', content: new OA\JsonContent(ref: '#/components/schemas/User')), + new OA\Response(response: 403, description: 'Sin permiso users.create'), + ] + )] + public function store(Request $request) + { + $this->authorize($request, 'users.create'); + + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')], + 'password' => ['required', 'string', 'min:8'], + 'role' => ['sometimes', Rule::in(Role::pluck('name'))], + ]); + + $user = User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + 'is_active' => true, + 'approved_at' => now(), // lo crea un admin/servicio de confianza: ya está aprobado. + ]); + + $user->assignRole($data['role'] ?? 'user'); + + return response()->json($this->present($user), 201); + } + + #[OA\Get( + path: '/users/{user}', + summary: 'Ver un usuario (el propio siempre permitido; otros requieren users.view)', + security: [['oauth2' => ['users:read']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + responses: [ + new OA\Response(response: 200, description: 'Datos del usuario', content: new OA\JsonContent(ref: '#/components/schemas/User')), + new OA\Response(response: 403, description: 'Sin permiso users.view'), + ] + )] + public function show(Request $request, User $user) + { + $this->authorize($request, 'users.view', $user); + + return response()->json($this->present($user)); + } + + #[OA\Put( + path: '/users/{user}', + summary: 'Editar un usuario (el propio siempre permitido; rol/estado y otros usuarios requieren users.update)', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + properties: [ + new OA\Property(property: 'name', type: 'string'), + new OA\Property(property: 'email', type: 'string', format: 'email'), + new OA\Property(property: 'password', type: 'string', format: 'password'), + new OA\Property(property: 'is_active', type: 'boolean'), + new OA\Property(property: 'role', type: 'string'), + ] + ) + ), + responses: [ + new OA\Response(response: 200, description: 'Usuario actualizado', content: new OA\JsonContent(ref: '#/components/schemas/User')), + new OA\Response(response: 403, description: 'Sin permiso users.update'), + ] + )] + public function update(Request $request, User $user) + { + $actor = $this->authorize($request, 'users.update', $user); + $isAdminAction = is_null($actor) || $actor->can('users.update'); + + $data = $request->validate([ + 'name' => ['sometimes', 'string', 'max:255'], + 'email' => ['sometimes', 'string', 'email', 'max:255', Rule::unique('users', 'email')->ignore($user->id)], + 'password' => ['sometimes', 'string', 'min:8'], + 'is_active' => ['sometimes', 'boolean'], + 'role' => ['sometimes', Rule::in(Role::pluck('name'))], + ]); + + if (! $isAdminAction) { + $data = array_intersect_key($data, array_flip(['name', 'email', 'password'])); + } + + if (isset($data['role']) && $user->id === $actor?->id && $data['role'] !== 'admin' && $user->hasRole('admin')) { + abort(422, __('messages.cannot_remove_own_admin_role')); + } + + $user->update([ + ...array_diff_key($data, array_flip(['password', 'role'])), + ...(isset($data['password']) ? ['password' => Hash::make($data['password'])] : []), + ]); + + if (isset($data['role'])) { + $user->syncRoles([$data['role']]); + } + + return response()->json($this->present($user->fresh())); + } + + #[OA\Delete( + path: '/users/{user}', + summary: 'Borrar un usuario (requiere users.delete; no se puede autoeliminar)', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + responses: [ + new OA\Response(response: 204, description: 'Usuario borrado'), + new OA\Response(response: 403, description: 'Sin permiso users.delete'), + new OA\Response(response: 422, description: 'No se puede autoeliminar ni borrar al último admin'), + ] + )] + public function destroy(Request $request, User $user) + { + $actor = $request->user('api'); + + abort_if($actor && $actor->id === $user->id, 422, __('messages.cannot_delete_self')); + abort_if($actor && ! $actor->can('users.delete'), 403); + + if ($user->hasRole('admin') && User::role('admin')->count() <= 1) { + abort(422, __('messages.cannot_delete_last_admin')); + } + + $user->delete(); + + return response()->noContent(); + } + + #[OA\Get( + path: '/users/trashed', + summary: 'Listar usuarios borrados (papelera)', + security: [['oauth2' => ['users:read']]], + tags: ['Users'], + responses: [ + new OA\Response(response: 200, description: 'Listado de usuarios en la papelera', content: new OA\JsonContent(type: 'array', items: new OA\Items(ref: '#/components/schemas/User'))), + new OA\Response(response: 403, description: 'Sin permiso users.view'), + ] + )] + public function trashed(Request $request) + { + $this->authorize($request, 'users.view'); + + return response()->json( + User::onlyTrashed()->orderByDesc('deleted_at')->get()->map($this->present(...)) + ); + } + + #[OA\Post( + path: '/users/{id}/restore', + summary: 'Restaurar un usuario borrado', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'id', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + responses: [ + new OA\Response(response: 200, description: 'Usuario restaurado', content: new OA\JsonContent(ref: '#/components/schemas/User')), + new OA\Response(response: 403, description: 'Sin permiso users.update'), + ] + )] + public function restore(Request $request, int $id) + { + $actor = $request->user('api'); + abort_if($actor && ! $actor->can('users.update'), 403); + + $user = User::onlyTrashed()->findOrFail($id); + $user->restore(); + + return response()->json($this->present($user)); + } + + #[OA\Delete( + path: '/users/{id}/force', + summary: 'Borrar un usuario definitivamente (tiene que estar en la papelera)', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'id', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + responses: [ + new OA\Response(response: 204, description: 'Borrado definitivamente'), + new OA\Response(response: 403, description: 'Sin permiso users.delete'), + ] + )] + public function forceDelete(Request $request, int $id) + { + $actor = $request->user('api'); + abort_if($actor && ! $actor->can('users.delete'), 403); + + $user = User::onlyTrashed()->findOrFail($id); + $user->forceDelete(); + + return response()->noContent(); + } + + #[OA\Get( + path: '/users/pending', + summary: 'Listar usuarios autorregistrados que todavía no aprobó ningún admin', + security: [['oauth2' => ['users:read']]], + tags: ['Users'], + responses: [ + new OA\Response(response: 200, description: 'Listado de usuarios pendientes', content: new OA\JsonContent(type: 'array', items: new OA\Items(ref: '#/components/schemas/User'))), + new OA\Response(response: 403, description: 'Sin permiso users.view'), + ] + )] + public function pending(Request $request) + { + $this->authorize($request, 'users.view'); + + return response()->json( + User::query()->whereNull('approved_at')->orderBy('created_at')->get()->map($this->present(...)) + ); + } + + #[OA\Post( + path: '/users/{user}/approve', + summary: 'Aprobar un registro pendiente', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + responses: [ + new OA\Response(response: 200, description: 'Usuario aprobado', content: new OA\JsonContent(ref: '#/components/schemas/User')), + new OA\Response(response: 403, description: 'Sin permiso users.update'), + ] + )] + public function approve(Request $request, User $user) + { + $actor = $request->user('api'); + abort_if($actor && ! $actor->can('users.update'), 403); + + $user->update(['approved_at' => now()]); + + return response()->json($this->present($user)); + } + + #[OA\Get( + path: '/users/{user}/app-roles', + summary: 'Roles que el usuario tiene en cada app (el propio siempre permitido; otros requieren users.view)', + security: [['oauth2' => ['users:read']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + responses: [new OA\Response(response: 200, description: 'Roles agrupados por app')] + )] + public function appRoles(Request $request, User $user) + { + $this->authorize($request, 'users.view', $user); + + $rows = DB::table('app_user_roles') + ->join('oauth_clients', 'oauth_clients.id', '=', 'app_user_roles.client_id') + ->where('app_user_roles.user_id', $user->id) + ->get(['oauth_clients.id as client_id', 'oauth_clients.name as client_name', 'app_user_roles.role']); + + return response()->json( + $rows->groupBy('client_id')->map(fn ($group) => [ + 'client_id' => $group->first()->client_id, + 'client_name' => $group->first()->client_name, + 'roles' => $group->pluck('role'), + ])->values() + ); + } + + #[OA\Post( + path: '/users/{user}/app-roles', + summary: 'Asignar un rol a un usuario dentro de una app (requiere users.update; sin bypass por self)', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + required: ['client_id', 'role'], + properties: [ + new OA\Property(property: 'client_id', type: 'string', format: 'uuid'), + new OA\Property(property: 'role', type: 'string', example: 'admin'), + ] + ) + ), + responses: [ + new OA\Response(response: 201, description: 'Rol asignado'), + new OA\Response(response: 403, description: 'Sin permiso users.update'), + ] + )] + public function assignAppRole(Request $request, User $user) + { + $actor = $request->user('api'); + abort_if($actor && ! $actor->can('users.update'), 403); + + $data = $request->validate([ + 'client_id' => ['required', 'exists:oauth_clients,id'], + 'role' => ['required', Rule::in(Role::pluck('name'))], + ]); + + DB::table('app_user_roles')->insertOrIgnore([ + 'user_id' => $user->id, + 'client_id' => $data['client_id'], + 'role' => $data['role'], + 'created_at' => now(), + 'updated_at' => now(), + ]); + + return response()->json($data, 201); + } + + #[OA\Delete( + path: '/users/{user}/app-roles/{clientId}/{role}', + summary: 'Quitarle a un usuario un rol dentro de una app (requiere users.update)', + security: [['oauth2' => ['users:write']]], + tags: ['Users'], + parameters: [ + new OA\Parameter(name: 'user', in: 'path', required: true, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'clientId', in: 'path', required: true, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'role', in: 'path', required: true, schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: 204, description: 'Rol quitado'), + new OA\Response(response: 403, description: 'Sin permiso users.update'), + ] + )] + public function revokeAppRole(Request $request, User $user, string $clientId, string $role) + { + $actor = $request->user('api'); + abort_if($actor && ! $actor->can('users.update'), 403); + + DB::table('app_user_roles') + ->where('user_id', $user->id) + ->where('client_id', $clientId) + ->where('role', $role) + ->delete(); + + return response()->noContent(); + } + + /** + * Un token client_credentials (sin usuario) actúa como servicio de confianza: + * ya validado por scope, no necesita permiso de usuario. Si hay usuario, puede + * operar siempre sobre sí mismo; sobre otros usuarios necesita el permiso dado. + */ + private function authorize(Request $request, string $permission, ?User $target = null): ?User + { + $actor = $request->user('api'); + + if (! $actor) { + return null; + } + + $isSelf = $target && $target->id === $actor->id; + + if (! $isSelf && ! $actor->can($permission)) { + abort(403); + } + + return $actor; + } + + /** + * Devuelve el usuario más "app_roles": los roles que tiene asignados + * específicamente para la app que está llamando (el cliente OAuth del + * token actual), guardados en app_user_roles — un sistema aparte del rol + * global de spatie (ver Admin\UserController::appRoles). + */ + private function present(User $user): array + { + $callingClientId = Auth::guard('api')->client()?->id; + + $appRoles = $callingClientId + ? DB::table('app_user_roles') + ->where('user_id', $user->id) + ->where('client_id', $callingClientId) + ->pluck('role') + : collect(); + + return [ + 'id' => $user->id, + 'name' => $user->name, + 'email' => $user->email, + 'is_active' => $user->is_active, + 'roles' => $user->getRoleNames(), + 'app_roles' => $appRoles, + 'created_at' => $user->created_at, + 'approved_at' => $user->approved_at, + ]; + } +} diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php new file mode 100644 index 0000000..d221bdb --- /dev/null +++ b/app/Http/Controllers/Auth/AuthController.php @@ -0,0 +1,141 @@ +json([ + 'empty' => User::query()->count() === 0, + ]); + } + + public function register(Request $request) + { + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')], + 'password' => ['required', 'string', 'min:8', 'confirmed'], + ]); + + // Instalación nueva (sin usuarios todavía): el primero en registrarse + // queda como admin, aprobado y logueado de una — no hay nadie más que + // pueda aprobarlo. De ahí en más, todo registro vuelve a requerir + // aprobación de un admin como siempre. + $isFirstUser = User::query()->count() === 0; + + $user = User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + 'is_active' => true, + 'approved_at' => $isFirstUser ? now() : null, + ]); + + if ($isFirstUser) { + (new RolesAndPermissionsSeeder)->run(); + $user->assignRole('admin'); + + Auth::login($user); + $request->session()->regenerate(); + $this->recordSessionLogin($request, $user); + + return response()->json([ + 'bootstrap' => true, + 'user' => $this->present($user), + 'intended' => $request->session()->pull('url.intended'), + ]); + } + + $user->assignRole('user'); + + return response()->json([ + 'pending' => true, + 'message' => __('messages.registration_pending'), + ], 201); + } + + public function login(Request $request) + { + $credentials = $request->validate([ + 'email' => ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]); + + if (! Auth::attempt($credentials, $request->boolean('remember'))) { + throw ValidationException::withMessages([ + 'email' => __('messages.invalid_credentials'), + ]); + } + + if (! Auth::user()->is_active) { + Auth::logout(); + + throw ValidationException::withMessages([ + 'email' => __('messages.account_deactivated'), + ]); + } + + if (Auth::user()->isPending()) { + Auth::logout(); + + throw ValidationException::withMessages([ + 'email' => __('messages.account_pending_approval'), + ]); + } + + $request->session()->regenerate(); + $this->recordSessionLogin($request, Auth::user()); + + return response()->json([ + 'user' => $this->present(Auth::user()), + 'intended' => $request->session()->pull('url.intended'), + ]); + } + + public function logout(Request $request) + { + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return response()->noContent(); + } + + public function me(Request $request) + { + return response()->json(['user' => $this->present($request->user())]); + } + + private function recordSessionLogin(Request $request, User $user): void + { + LoginEvent::create([ + 'user_id' => $user->id, + 'client_id' => null, + 'type' => 'session', + 'ip_address' => $request->ip(), + 'user_agent' => $request->userAgent(), + 'created_at' => now(), + ]); + } + + private function present(User $user): array + { + return [ + ...$user->toArray(), + 'roles' => $user->getRoleNames(), + 'permissions' => $user->getAllPermissions()->pluck('name'), + ]; + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..09c3e74 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,55 @@ + 'Leer usuarios', + 'users:write' => 'Crear, editar y borrar usuarios', + 'account:read' => 'Leer tus clientes OAuth, tokens y apps autorizadas', + 'account:write' => 'Gestionar tus clientes OAuth, tokens y apps autorizadas', + ] + ), + new OA\Flow( + flow: 'clientCredentials', + tokenUrl: '/oauth/token', + scopes: [ + 'users:read' => 'Leer usuarios', + 'users:write' => 'Crear, editar y borrar usuarios', + 'account:read' => 'Leer tus clientes OAuth, tokens y apps autorizadas', + 'account:write' => 'Gestionar tus clientes OAuth, tokens y apps autorizadas', + ] + ), + new OA\Flow( + flow: 'password', + tokenUrl: '/oauth/token', + scopes: [ + 'users:read' => 'Leer usuarios', + 'users:write' => 'Crear, editar y borrar usuarios', + 'account:read' => 'Leer tus clientes OAuth, tokens y apps autorizadas', + 'account:write' => 'Gestionar tus clientes OAuth, tokens y apps autorizadas', + ] + ), + ] +)] +abstract class Controller +{ + // +} diff --git a/app/Http/Controllers/OAuth/AuthorizedAppController.php b/app/Http/Controllers/OAuth/AuthorizedAppController.php new file mode 100644 index 0000000..4aad1a3 --- /dev/null +++ b/app/Http/Controllers/OAuth/AuthorizedAppController.php @@ -0,0 +1,36 @@ +user()->tokens() + ->where('revoked', false) + ->with('client') + ->get() + ->reject(fn ($token) => $token->client->revoked || $token->client->hasGrantType('personal_access')) + ->values(); + + return response()->json($tokens); + } + + public function destroy(Request $request, string $tokenId) + { + $token = $request->user()->tokens()->where('id', $tokenId)->first(); + + abort_unless($token, 404); + + $token->revoke(); + $token->refreshToken?->revoke(); + + return response()->noContent(); + } +} diff --git a/app/Http/Controllers/OAuth/ClientController.php b/app/Http/Controllers/OAuth/ClientController.php new file mode 100644 index 0000000..3b29318 --- /dev/null +++ b/app/Http/Controllers/OAuth/ClientController.php @@ -0,0 +1,97 @@ +json( + $request->user()->oauthApps()->where('revoked', false)->orderByDesc('created_at')->get() + ); + } + + /** + * Create a new OAuth client (authorization_code+PKCE, client_credentials or password). + */ + public function store(Request $request) + { + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'grant_type' => ['required', Rule::in(['authorization_code', 'client_credentials', 'password'])], + 'redirect_uris' => ['required_if:grant_type,authorization_code', 'array'], + 'redirect_uris.*' => ['url'], + 'confidential' => ['boolean'], + ]); + + $confidential = $request->boolean('confidential', true); + + $grantTypes = match ($data['grant_type']) { + 'authorization_code' => ['authorization_code', 'refresh_token'], + 'password' => ['password', 'refresh_token'], + 'client_credentials' => ['client_credentials'], + }; + + // client_credentials always needs a secret: there is no user present to prove identity. + if ($data['grant_type'] === 'client_credentials') { + $confidential = true; + } + + $client = $request->user()->oauthApps()->create([ + 'name' => $data['name'], + 'secret' => $confidential ? Str::random(40) : null, + 'provider' => null, + 'redirect_uris' => $data['redirect_uris'] ?? [], + 'grant_types' => $grantTypes, + 'revoked' => false, + ]); + + return response()->json([ + 'client' => $client, + 'plain_secret' => $client->plainSecret, + ], 201); + } + + /** + * Update an existing client's name/redirect URIs. + */ + public function update(Request $request, Client $client) + { + abort_unless($client->owner_id === $request->user()->id, 404); + + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'redirect_uris' => ['array'], + 'redirect_uris.*' => ['url'], + ]); + + $client->update([ + 'name' => $data['name'], + 'redirect_uris' => $data['redirect_uris'] ?? $client->redirect_uris, + ]); + + return response()->json($client); + } + + /** + * Revoke (soft-delete) a client and its tokens. + */ + public function destroy(Request $request, Client $client) + { + abort_unless($client->owner_id === $request->user()->id, 404); + + $client->update(['revoked' => true]); + $client->tokens()->update(['revoked' => true]); + + return response()->noContent(); + } +} diff --git a/app/Http/Controllers/OAuth/PersonalAccessTokenController.php b/app/Http/Controllers/OAuth/PersonalAccessTokenController.php new file mode 100644 index 0000000..4f1fadf --- /dev/null +++ b/app/Http/Controllers/OAuth/PersonalAccessTokenController.php @@ -0,0 +1,51 @@ +json( + $request->user()->tokens() + ->where('revoked', false) + ->whereHas('client', fn ($q) => $q->whereJsonContains('grant_types', 'personal_access')) + ->orderByDesc('created_at') + ->get(['id', 'name', 'scopes', 'created_at', 'expires_at']) + ); + } + + public function store(Request $request) + { + $data = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'scopes' => ['array'], + 'scopes.*' => [Rule::in(Passport::scopeIds())], + ]); + + $result = $request->user()->createToken($data['name'], $data['scopes'] ?? []); + + return response()->json([ + 'access_token' => $result->accessToken, + 'token' => $result->token, + ], 201); + } + + public function destroy(Request $request, string $tokenId) + { + /** @var Token|null $token */ + $token = $request->user()->tokens()->where('id', $tokenId)->first(); + + abort_unless($token, 404); + + $token->revoke(); + + return response()->noContent(); + } +} diff --git a/app/Http/Middleware/SetLocale.php b/app/Http/Middleware/SetLocale.php new file mode 100644 index 0000000..24b329d --- /dev/null +++ b/app/Http/Middleware/SetLocale.php @@ -0,0 +1,22 @@ +session()->get('locale', config('app.locale')); + + App::setLocale(in_array($locale, self::SUPPORTED, true) ? $locale : config('app.locale')); + + return $next($request); + } +} diff --git a/app/Listeners/RecordOAuthLoginEvent.php b/app/Listeners/RecordOAuthLoginEvent.php new file mode 100644 index 0000000..1b74de8 --- /dev/null +++ b/app/Listeners/RecordOAuthLoginEvent.php @@ -0,0 +1,31 @@ + $event->userId, + 'client_id' => $event->clientId, + 'type' => 'oauth', + 'ip_address' => $this->request->ip(), + 'user_agent' => $this->request->userAgent(), + 'created_at' => now(), + ]); + } +} diff --git a/app/Models/LoginEvent.php b/app/Models/LoginEvent.php new file mode 100644 index 0000000..99319fa --- /dev/null +++ b/app/Models/LoginEvent.php @@ -0,0 +1,24 @@ +belongsTo(User::class); + } + + public function client(): BelongsTo + { + return $this->belongsTo(Client::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..fac7787 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,43 @@ + */ + use HasApiTokens, HasFactory, HasRoles, Notifiable, SoftDeletes; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + 'is_active' => 'boolean', + 'deleted_at' => 'datetime', + 'approved_at' => 'datetime', + ]; + } + + public function isPending(): bool + { + return $this->approved_at === null; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..93655d9 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,50 @@ +addDays(15)); + Passport::refreshTokensExpireIn(now()->addDays(30)); + Passport::personalAccessTokensExpireIn(now()->addMonths(6)); + + Passport::tokensCan([ + 'users:read' => 'Leer usuarios', + 'users:write' => 'Crear, editar y borrar usuarios', + 'account:read' => 'Leer tus clientes OAuth, tokens y apps autorizadas', + 'account:write' => 'Gestionar tus clientes OAuth, tokens y apps autorizadas', + ]); + + // Sin scope por defecto: los datos de usuarios son sensibles, el cliente + // tiene que pedir explícitamente el acceso que necesita. + + // La pantalla de consentimiento la renderiza la SPA Vue (ver Authorize.vue). + // Passport inyecta client/user/scopes/authToken; se los pasamos al shell Blade + // como JSON para que el JS los lea (ver resources/views/app.blade.php). + Passport::authorizationView('app'); + + Event::listen(AccessTokenCreated::class, RecordOAuthLoginEvent::class); + } +} diff --git a/app/Support/AnalyticsSummary.php b/app/Support/AnalyticsSummary.php new file mode 100644 index 0000000..395ec72 --- /dev/null +++ b/app/Support/AnalyticsSummary.php @@ -0,0 +1,103 @@ +subDays($days - 1)->startOfDay(); + + return [ + 'kpis' => [ + 'total_users' => User::count(), + 'active_sessions' => Token::query()->where('revoked', false)->where('expires_at', '>', now())->count(), + 'logins_today' => LoginEvent::whereDate('created_at', today())->count(), + 'logins_7d' => LoginEvent::where('created_at', '>=', now()->subDays(7))->count(), + ], + 'logins_by_day' => self::loginsByDay($since, $days), + 'logins_by_app' => self::loginsByApp($since), + 'top_users' => self::topUsers($since), + 'recent' => self::recent(), + ]; + } + + private static function loginsByDay(Carbon $since, int $days): array + { + $rows = LoginEvent::query() + ->selectRaw("date(created_at) as day, type, count(*) as count") + ->where('created_at', '>=', $since) + ->groupBy('day', 'type') + ->get() + ->groupBy('day'); + + $out = []; + for ($i = 0; $i < $days; $i++) { + $date = $since->copy()->addDays($i)->toDateString(); + $dayRows = $rows->get($date, collect()); + + $out[] = [ + 'date' => $date, + 'session' => (int) $dayRows->firstWhere('type', 'session')?->count, + 'oauth' => (int) $dayRows->firstWhere('type', 'oauth')?->count, + ]; + } + + return $out; + } + + private static function loginsByApp(Carbon $since): array + { + return LoginEvent::query() + ->join('oauth_clients', 'oauth_clients.id', '=', 'login_events.client_id') + ->where('login_events.type', 'oauth') + ->where('login_events.created_at', '>=', $since) + ->groupBy('oauth_clients.id', 'oauth_clients.name') + ->orderByDesc('count') + ->limit(8) + ->get(['oauth_clients.name as client_name', DB::raw('count(*) as count')]) + ->toArray(); + } + + private static function topUsers(Carbon $since): array + { + return LoginEvent::query() + ->join('users', 'users.id', '=', 'login_events.user_id') + ->where('login_events.created_at', '>=', $since) + ->groupBy('users.id', 'users.name', 'users.email') + ->orderByDesc('count') + ->limit(8) + ->get(['users.name', 'users.email', DB::raw('count(*) as count')]) + ->toArray(); + } + + private static function recent(int $limit = 15): array + { + return LoginEvent::with(['user:id,name,email', 'client:id,name']) + ->latest('created_at') + ->limit($limit) + ->get() + ->map(fn (LoginEvent $event) => [ + 'user_name' => $event->user?->name, + 'user_email' => $event->user?->email, + // null para logins de sesión (el frontend lo traduce como "Panel admin"/"Admin + // panel" según el idioma) y para apps borradas (el frontend traduce ese caso + // también) — así el backend no filtra texto sin traducir a la UI. + 'client_name' => $event->type === 'session' ? null : $event->client?->name, + 'type' => $event->type, + 'ip_address' => $event->ip_address, + 'created_at' => $event->created_at, + ]) + ->toArray(); + } +} diff --git a/artisan b/artisan new file mode 100755 index 0000000..c35e31d --- /dev/null +++ b/artisan @@ -0,0 +1,18 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..b068688 --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,23 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware): void { + $middleware->web(append: [SetLocale::class]); + }) + ->withExceptions(function (Exceptions $exceptions): void { + $exceptions->shouldRenderJsonWhen( + fn (Request $request) => $request->is('api/*') || $request->is('web-api/*') || $request->expectsJson(), + ); + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..fc94ae6 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,7 @@ +=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "darkaonline/l5-swagger", + "version": "11.1.0", + "source": { + "type": "git", + "url": "https://github.com/DarkaOnLine/L5-Swagger.git", + "reference": "110b59478c9417c13794cef62a82b019433d642a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/110b59478c9417c13794cef62a82b019433d642a", + "reference": "110b59478c9417c13794cef62a82b019433d642a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^13.0 || ^12.1 || ^11.44", + "php": "^8.2", + "swagger-api/swagger-ui": ">=5.18.3", + "symfony/yaml": "^5.0 || ^6.0 || ^7.0 || ^8.0", + "zircote/swagger-php": "^6.0" + }, + "require-dev": { + "mockery/mockery": "1.*", + "orchestra/testbench": "^11.0 || ^10.0 || ^9.0 || ^8.0 || 7.* || ^6.15 || 5.*", + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "L5Swagger": "L5Swagger\\L5SwaggerFacade" + }, + "providers": [ + "L5Swagger\\L5SwaggerServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "L5Swagger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Darius Matulionis", + "email": "darius@matulionis.lt" + } + ], + "description": "OpenApi or Swagger integration to Laravel", + "keywords": [ + "api", + "documentation", + "laravel", + "openapi", + "specification", + "swagger", + "ui" + ], + "support": { + "issues": "https://github.com/DarkaOnLine/L5-Swagger/issues", + "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/11.1.0" + }, + "funding": [ + { + "url": "https://github.com/DarkaOnLine", + "type": "github" + } + ], + "time": "2026-06-12T10:04:41+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "support": { + "issues": "https://github.com/defuse/php-encryption/issues", + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + }, + "time": "2023-06-19T06:10:36+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v7.1.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-jwt.git", + "reference": "b374a5d1a4f1f67fadc2165cdb284645945e2fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/b374a5d1a4f1f67fadc2165cdb284645945e2fc0", + "reference": "b374a5d1a4f1f67fadc2165cdb284645945e2fc0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpfastcache/phpfastcache": "^9.2", + "phpseclib/phpseclib": "~3.0", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present", + "phpseclib/phpseclib": "Support PS256 (RSASSA-PSS) signatures" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/googleapis/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.1.0" + }, + "time": "2026-06-11T17:54:14+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:43:20+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.15.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "61443dfb33c62f308ee8add20f45b4d6e4bf8d2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/61443dfb33c62f308ee8add20f45b4d6e4bf8d2f", + "reference": "61443dfb33c62f308ee8add20f45b4d6e4bf8d2f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.5.1", + "guzzlehttp/psr7": "^2.13", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.25" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.3", + "guzzlehttp/test-server": "^0.7", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.15.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2026-07-18T11:23:11+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "9ad1e4fc607446a055b95870c7f668e93b5cff29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/9ad1e4fc607446a055b95870c7f668e93b5cff29", + "reference": "9ad1e4fc607446a055b95870c7f668e93b5cff29", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.52 || ^9.6.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.5.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2026-07-08T15:48:39+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dad89620b7a6edb60c15858442eb2e408b45d8f4", + "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.25" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "1.1.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.52 || ^9.6.34" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.13.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2026-07-16T22:23:49+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.10", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "f6c24c21f42b990e9a58912b332d0874df6ba839" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/f6c24c21f42b990e9a58912b332d0874df6ba839", + "reference": "f6c24c21f42b990e9a58912b332d0874df6ba839", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.25" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.10" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2026-07-17T13:53:03+00:00" + }, + { + "name": "laravel/framework", + "version": "v13.22.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "d354afa45334cdac523fbc015f203a78d7e2f5c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/d354afa45334cdac523fbc015f203a78d7e2f5c6", + "reference": "d354afa45334cdac523fbc015f203a78d7e2f5c6", + "shasum": "" + }, + "require": { + "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17 || ^0.18", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^2.0.10", + "league/commonmark": "^2.8.1", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.3", + "psr/container": "^1.1.1 || ^2.0.1", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.4.0 || ^8.0.0", + "symfony/error-handler": "^7.4.0 || ^8.0.0", + "symfony/finder": "^7.4.0 || ^8.0.0", + "symfony/http-foundation": "^7.4.0 || ^8.0.0", + "symfony/http-kernel": "^7.4.0 || ^8.0.0", + "symfony/mailer": "^7.4.0 || ^8.0.0", + "symfony/mime": "^7.4.0 || ^8.0.0", + "symfony/polyfill-php84": "^1.36", + "symfony/polyfill-php85": "^1.36", + "symfony/polyfill-php86": "^1.36", + "symfony/process": "^7.4.5 || ^8.0.5", + "symfony/routing": "^7.4.0 || ^8.0.0", + "symfony/uid": "^7.4.0 || ^8.0.0", + "symfony/var-dumper": "^7.4.0 || ^8.0.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1 || 2.0", + "psr/log-implementation": "1.0 || 2.0 || 3.0", + "psr/simple-cache-implementation": "1.0 || 2.0 || 3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/image": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/psr7": "^2.9", + "intervention/image": "^4.0", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^11.0.0", + "pda/pheanstalk": "^7.0.0 || ^8.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", + "predis/predis": "^2.3 || ^3.0", + "rector/rector": "^2.3", + "resend/resend-php": "^1.0", + "symfony/cache": "^7.4.0 || ^8.0.0", + "symfony/http-client": "^7.4.0 || ^8.0.0", + "symfony/psr-http-message-bridge": "^7.4.0 || ^8.0.0", + "symfony/translation": "^7.4.0 || ^8.0.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0 || ^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0 || ^5.0 || ^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "intervention/image": "Required to use the image processing features (^4.0).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^7.0 || ^8.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^11.5.50 || ^12.5.8 || ^13.0.3).", + "predis/predis": "Required to use the predis connector (^2.3 || ^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0 || ^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0 || ^1.0).", + "spatie/fork": "Required to use the 'fork' concurrency driver (^1.2).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.4 || ^8.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.4 || ^8.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4 || ^8.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4 || ^8.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4 || ^8.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "13.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-07-24T20:38:48+00:00" + }, + { + "name": "laravel/passport", + "version": "v13.7.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "90053dc4ba681c076855779250109bb624f961f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/90053dc4ba681c076855779250109bb624f961f6", + "reference": "90053dc4ba681c076855779250109bb624f961f6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "firebase/php-jwt": "^6.4|^7.0", + "illuminate/auth": "^11.35|^12.0|^13.0", + "illuminate/console": "^11.35|^12.0|^13.0", + "illuminate/container": "^11.35|^12.0|^13.0", + "illuminate/contracts": "^11.35|^12.0|^13.0", + "illuminate/cookie": "^11.35|^12.0|^13.0", + "illuminate/database": "^11.35|^12.0|^13.0", + "illuminate/encryption": "^11.35|^12.0|^13.0", + "illuminate/http": "^11.35|^12.0|^13.0", + "illuminate/support": "^11.35|^12.0|^13.0", + "league/oauth2-server": "^9.2", + "php": "^8.2", + "php-http/discovery": "^1.20", + "phpseclib/phpseclib": "^3.0", + "psr/http-factory-implementation": "*", + "symfony/console": "^7.1|^8.0", + "symfony/psr-http-message-bridge": "^7.1|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/", + "Laravel\\Passport\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "support": { + "issues": "https://github.com/laravel/passport/issues", + "source": "https://github.com/laravel/passport" + }, + "time": "2026-04-16T14:00:29+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.21", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "7753c65c281c2550c7c183f14e18062073b7d821" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/7753c65c281c2550c7c183f14e18062073b7d821", + "reference": "7753c65c281c2550c7c183f14e18062073b7d821", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0|^8.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.21" + }, + "time": "2026-06-26T00:11:25+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.15", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2026-07-21T16:49:22+00:00" + }, + { + "name": "laravel/tinker", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "4faba77764bd33411735936acdf30446d058c78b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/4faba77764bd33411735936acdf30446d058c78b", + "reference": "4faba77764bd33411735936acdf30446d058c78b", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "psy/psysh": "^0.12.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5|^11.5" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^8.0|^9.0|^10.0|^11.0|^12.0|^13.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v3.0.2" + }, + "time": "2026-03-17T14:54:13+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.6.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-17T11:30:53+00:00" + }, + { + "name": "league/commonmark", + "version": "2.8.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "1902f60f984235023acbe03db6ad614a37b3c3e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/1902f60f984235023acbe03db6ad614a37b3c3e7", + "reference": "1902f60f984235023acbe03db6ad614a37b3c3e7", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.9-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2026-07-12T15:29:16+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/event", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "psr/event-dispatcher": "^1.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.12.45", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/3.0.3" + }, + "time": "2024-09-04T16:06:53+00:00" + }, + { + "name": "league/flysystem", + "version": "3.35.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "b277b5dc3d56650b68904117124e79c851e12376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b277b5dc3d56650b68904117124e79c851e12376", + "reference": "b277b5dc3d56650b68904117124e79c851e12376", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.35.2" + }, + "time": "2026-07-06T14:42:07+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.31.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + }, + "time": "2026-01-23T15:30:45+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.17.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.17.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2026-07-09T11:49:27+00:00" + }, + { + "name": "league/oauth2-server", + "version": "9.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "9d2f6fc0a0b5aa1bb02506971d3a4ecff2c6526c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/9d2f6fc0a0b5aa1bb02506971d3a4ecff2c6526c", + "reference": "9d2f6fc0a0b5aa1bb02506971d3a4ecff2c6526c", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.4", + "ext-json": "*", + "ext-openssl": "*", + "lcobucci/jwt": "^5.6", + "league/event": "^3.0", + "league/uri": "^7.8", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0", + "psr/http-message": "^2.0", + "psr/http-server-middleware": "^1.0" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "laminas/laminas-diactoros": "^3.8", + "paragonie/random_compat": "^9.99.100", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.38", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0.12", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^11.5.50", + "roave/security-advisories": "dev-master", + "slevomat/coding-standard": "^8.27.1", + "squizlabs/php_codesniffer": "^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Andy Millington", + "email": "andrew@noexceptions.io", + "homepage": "https://www.noexceptions.io", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-server/issues", + "source": "https://github.com/thephpleague/oauth2-server/tree/9.4.1" + }, + "funding": [ + { + "url": "https://github.com/sephster", + "type": "github" + } + ], + "time": "2026-06-25T15:24:07+00:00" + }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-01-02T08:56:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.13.1", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "2937ad3d1d2c506fd2bc97d571438a95641f44e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/2937ad3d1d2c506fd2bc97d571438a95641f44e2", + "reference": "2937ad3d1d2c506fd2bc97d571438a95641f44e2", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-07-09T18:23:49+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.5" + }, + "time": "2026-02-23T03:47:12+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::chr(), ord() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.5" + }, + "time": "2026-07-17T23:02:45+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.8.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" + }, + "time": "2026-07-04T14:30:18+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.4.4 || ^8.0.4" + }, + "require-dev": { + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "It's like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2026-02-16T23:10:27+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:41:33+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.55", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "db9744e6d47e742b1f974e965ad49bdd041105af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/db9744e6d47e742b1f974e965ad49bdd041105af", + "reference": "db9744e6d47e742b1f974e965ad49bdd041105af", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.55" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2026-06-14T23:24:10+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", + "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.3" + }, + "time": "2026-07-08T07:01:06+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.24", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.24" + }, + "time": "2026-06-29T15:41:09+00:00" + }, + { + "name": "radebatz/type-info-extras", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/DerManoMann/type-info-extras.git", + "reference": "95a524a74a61648b44e355cb33d38db4b17ef5ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DerManoMann/type-info-extras/zipball/95a524a74a61648b44e355cb33d38db4b17ef5ce", + "reference": "95a524a74a61648b44e355cb33d38db4b17ef5ce", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "phpstan/phpdoc-parser": "^2.0", + "symfony/type-info": "^7.3.8 || ^7.4.1 || ^8.0 || ^8.1-@dev" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.70", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Radebatz\\TypeInfoExtras\\": "src" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Rademacher", + "email": "mano@radebatz.org" + } + ], + "description": "Extras for symfony/type-info", + "homepage": "http://radebatz.net/mano/", + "keywords": [ + "component", + "symfony", + "type-info", + "types" + ], + "support": { + "issues": "https://github.com/DerManoMann/type-info-extras/issues", + "source": "https://github.com/DerManoMann/type-info-extras/tree/1.0.7" + }, + "time": "2026-03-06T22:40:29+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/1df15849d00943a67d677dc9cfd80795f038c9f8", + "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8", + "shasum": "" + }, + "require": { + "brick/math": ">=0.8.16 <=0.18", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.3" + }, + "time": "2026-06-18T03:57:49+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.93.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "d5552849801f2642aea710557463234b59ef65eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d5552849801f2642aea710557463234b59ef65eb", + "reference": "d5552849801f2642aea710557463234b59ef65eb", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^8.0|^9.2|^10.0|^11.0", + "pestphp/pest": "^2.1|^3.1|^4.0", + "phpunit/php-code-coverage": "^10.0|^11.0|^12.0", + "phpunit/phpunit": "^10.5|^11.5|^12.5", + "spatie/pest-plugin-test-time": "^2.2|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-05-19T14:06:37+00:00" + }, + { + "name": "spatie/laravel-permission", + "version": "8.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-permission.git", + "reference": "60e8ed5b2fbf043c2264433fc2680c76b8b66aa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/60e8ed5b2fbf043c2264433fc2680c76b8b66aa6", + "reference": "60e8ed5b2fbf043c2264433fc2680c76b8b66aa6", + "shasum": "" + }, + "require": { + "illuminate/auth": "^12.0|^13.0", + "illuminate/container": "^12.0|^13.0", + "illuminate/contracts": "^12.0|^13.0", + "illuminate/database": "^12.0|^13.0", + "php": "^8.3", + "spatie/laravel-package-tools": "^1.0" + }, + "require-dev": { + "larastan/larastan": "^3.9", + "laravel/octane": "^2.0", + "laravel/passport": "^13.0", + "laravel/pint": "^1.0", + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^3.0|^4.0", + "pestphp/pest-plugin-laravel": "^3.0|^4.1", + "phpstan/phpstan": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Permission\\PermissionServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "8.x-dev", + "dev-master": "8.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Permission\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Permission handling for Laravel 12 and up", + "homepage": "https://github.com/spatie/laravel-permission", + "keywords": [ + "acl", + "laravel", + "permission", + "permissions", + "rbac", + "roles", + "security", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-permission/issues", + "source": "https://github.com/spatie/laravel-permission/tree/8.3.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-07-03T15:36:01+00:00" + }, + { + "name": "swagger-api/swagger-ui", + "version": "v5.32.11", + "source": { + "type": "git", + "url": "https://github.com/swagger-api/swagger-ui.git", + "reference": "414a60c9a40408d37821297682b8a190a840a79b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/414a60c9a40408d37821297682b8a190a840a79b", + "reference": "414a60c9a40408d37821297682b8a190a840a79b", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Anna Bodnia", + "email": "anna.bodnia@gmail.com" + }, + { + "name": "Buu Nguyen", + "email": "buunguyen@gmail.com" + }, + { + "name": "Josh Ponelat", + "email": "jponelat@gmail.com" + }, + { + "name": "Kyle Shockey", + "email": "kyleshockey1@gmail.com" + }, + { + "name": "Robert Barnwell", + "email": "robert@robertismy.name" + }, + { + "name": "Sahar Jafari", + "email": "shr.jafari@gmail.com" + } + ], + "description": " Swagger UI is a collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.", + "homepage": "http://swagger.io", + "keywords": [ + "api", + "documentation", + "openapi", + "specification", + "swagger", + "ui" + ], + "support": { + "issues": "https://github.com/swagger-api/swagger-ui/issues", + "source": "https://github.com/swagger-api/swagger-ui/tree/v5.32.11" + }, + "time": "2026-07-22T07:31:41+00:00" + }, + { + "name": "symfony/clock", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/console", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", + "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.32", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.4.6|^8.0.6" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher": "<8.1" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-16T12:55:20+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/dc0e2be45c9b5588c82414f02ac574b4b986abcd", + "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d8aeb1abd3fef84795567850d3a567bdb5945ee5", + "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^7.4|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "abd6c11dc468725d1627302ad10f6cd486e9e3d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abd6c11dc468725d1627302ad10f6cd486e9e3d0", + "reference": "abd6c11dc468725d1627302ad10f6cd486e9e3d0", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/security-http": "<7.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-09T12:28:30+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/finder", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e2989e762c70f9490fa3a00a0ac0fae5aa97a531", + "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-27T09:05:56+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6a168c8fcee806b57ac020244da14293d1f9a883" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6a168c8fcee806b57ac020244da14293d1f9a883", + "reference": "6a168c8fcee806b57ac020244da14293d1f9a883", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<4.3" + }, + "require-dev": { + "doctrine/dbal": "^4.3", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-12T08:43:41+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2", + "reference": "89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/flex": "<2.10", + "symfony/http-client-contracts": "<2.5", + "symfony/translation-contracts": "<2.5", + "symfony/var-dumper": "<8.1", + "symfony/web-profiler-bundle": "<8.1", + "twig/twig": "<3.21" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/css-selector": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/dom-crawler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^8.1", + "symfony/var-exporter": "^7.4|^8.0", + "twig/twig": "^3.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-27T09:27:36+00:00" + }, + { + "name": "symfony/mailer", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "4fa583a7377f28d54e4de442fba76375b2e20a12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/4fa583a7377f28d54e4de442fba76375b2e20a12", + "reference": "4fa583a7377f28d54e4de442fba76375b2e20a12", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.4.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-16T12:55:20+00:00" + }, + { + "name": "symfony/mime", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/b164ae7e3f7915aacfe9ee155f2f358502440664", + "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T05:58:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "dc21118016c039a66235cf93d96b435ffb282412" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", + "reference": "dc21118016c039a66235cf93d96b435ffb282412", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-25T15:22:23+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.38.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:48:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-27T06:59:30+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:51:13+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T02:25:22+00:00" + }, + { + "name": "symfony/polyfill-php86", + "version": "v1.38.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php86.git", + "reference": "fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad", + "reference": "fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php86\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php86/tree/v1.38.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-25T11:52:35+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/process", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", + "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "67fd34de15ded1763aa1e330fe345f080a94022c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/67fd34de15ded1763aa1e330fe345f080a94022c", + "reference": "67fd34de15ded1763aa1e330fe345f080a94022c", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^7.4|^8.0" + }, + "conflict": { + "php-http/discovery": "<1.15" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/routing", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", + "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-16T09:55:08+00:00" + }, + { + "name": "symfony/string", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/translation", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "342b4218630dc2cf284cedcb2080c80b13404014" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/342b4218630dc2cf284cedcb2080c80b13404014", + "reference": "342b4218630dc2cf284cedcb2080c80b13404014", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation-contracts": "^3.6.1" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/http-client-contracts": "<2.5", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-06T11:11:44+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/type-info", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", + "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/uid", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "7393f157a55f7e70a4de0334435c55a5a8fe749a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/7393f157a55f7e70a4de0334435c55a5a8fe749a", + "reference": "7393f157a55f7e70a4de0334435c55a5a8fe749a", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "40096a2515a979f3125c5c928603995b8664c62a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/40096a2515a979f3125c5c928603995b8664c62a", + "reference": "40096a2515a979f3125c5c928603995b8664c62a", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-09T10:54:51+00:00" + }, + { + "name": "symfony/yaml", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "8e4cdd4311683516be06944f4b85244063cdb886" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8e4cdd4311683516be06944f4b85244063cdb886", + "reference": "8e4cdd4311683516be06944f4b85244063cdb886", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-09T11:06:24+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.4", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b", + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.4", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2026-07-06T19:11:50+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2026-04-26T05:33:54+00:00" + }, + { + "name": "zircote/swagger-php", + "version": "6.4.0", + "source": { + "type": "git", + "url": "https://github.com/zircote/swagger-php.git", + "reference": "d2006242dae81ae8833ad9a0ffb74e3254654cff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/d2006242dae81ae8833ad9a0ffb74e3254654cff", + "reference": "d2006242dae81ae8833ad9a0ffb74e3254654cff", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.19 || ^5.0", + "php": ">=8.2", + "phpstan/phpdoc-parser": "^2.0", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "radebatz/type-info-extras": "^1.0.2", + "symfony/console": "^7.4 || ^8.0", + "symfony/deprecation-contracts": "^2 || ^3", + "symfony/finder": "^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "conflict": { + "symfony/process": ">=6, <6.4.14" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "friendsofphp/php-cs-fixer": "^3.62.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^11.5 || >=12.5.22", + "rector/rector": "^2.3.1" + }, + "bin": [ + "bin/openapi" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenApi\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Robert Allen", + "email": "zircote@gmail.com" + }, + { + "name": "Bob Fanger", + "email": "bfanger@gmail.com", + "homepage": "https://bfanger.nl" + }, + { + "name": "Martin Rademacher", + "email": "mano@radebatz.net", + "homepage": "https://radebatz.net" + } + ], + "description": "Generate interactive documentation for your RESTful API using PHP attributes (preferred) or PHPDoc annotations", + "homepage": "https://github.com/zircote/swagger-php", + "keywords": [ + "api", + "json", + "rest", + "service discovery" + ], + "support": { + "issues": "https://github.com/zircote/swagger-php/issues", + "source": "https://github.com/zircote/swagger-php/tree/6.4.0" + }, + "funding": [ + { + "url": "https://github.com/zircote", + "type": "github" + } + ], + "time": "2026-07-12T03:44:54+00:00" + } + ], + "packages-dev": [ + { + "name": "archtechx/enums", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/archtechx/enums.git", + "reference": "81375b71c176f680880a95e7448d84258cfb5c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/enums/zipball/81375b71c176f680880a95e7448d84258cfb5c72", + "reference": "81375b71c176f680880a95e7448d84258cfb5c72", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "larastan/larastan": "^2.4", + "orchestra/testbench": "^8.0 || ^9.0", + "pestphp/pest": "^2.0", + "pestphp/pest-plugin-laravel": "^2.0" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "ArchTech\\Enums\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel@archte.ch" + } + ], + "description": "Helpers for making PHP enums more lovable.", + "support": { + "issues": "https://github.com/archtechx/enums/issues", + "source": "https://github.com/archtechx/enums/tree/v1.1.2" + }, + "time": "2025-06-06T23:15:09+00:00" + }, + { + "name": "codezero/browser-locale", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/codezero-be/browser-locale.git", + "reference": "dd6c50e5557b06b57960df6db7f52e85ef683e5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/codezero-be/browser-locale/zipball/dd6c50e5557b06b57960df6db7f52e85ef683e5e", + "reference": "dd6c50e5557b06b57960df6db7f52e85ef683e5e", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "phpunit/phpunit": "^6.0|^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "CodeZero\\BrowserLocale\\Laravel\\BrowserLocaleServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "CodeZero\\BrowserLocale\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivan Vermeyen", + "email": "ivan@codezero.be" + } + ], + "description": "Get the most preferred locales from your visitor's browser.", + "keywords": [ + "browser", + "country", + "detect", + "language", + "locale", + "php", + "website" + ], + "support": { + "issues": "https://github.com/codezero-be/browser-locale/issues", + "source": "https://github.com/codezero-be/browser-locale/tree/3.4.0" + }, + "funding": [ + { + "url": "https://paypal.me/ivanvermeyen", + "type": "custom" + }, + { + "url": "https://ko-fi.com/ivanvermeyen", + "type": "ko_fi" + } + ], + "time": "2024-03-02T12:51:17+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/86d8208fc3c649a3a999daf1a63c25201be2990f", + "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.7.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-05-05T09:17:07+00:00" + }, + { + "name": "composer/pcre", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<2.2.2" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-06-07T11:47:49+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "dragon-code/contracts", + "version": "2.25.0", + "source": { + "type": "git", + "url": "https://github.com/TheDragonCode/contracts.git", + "reference": "13d1254801026be5ba33cf1309a414953869175f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TheDragonCode/contracts/zipball/13d1254801026be5ba33cf1309a414953869175f", + "reference": "13d1254801026be5ba33cf1309a414953869175f", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-message": "^1.0.1 || ^2.0", + "symfony/http-kernel": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/polyfill-php80": "^1.23" + }, + "conflict": { + "andrey-helldar/contracts": "*" + }, + "require-dev": { + "illuminate/database": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "phpdocumentor/reflection-docblock": "^5.0 || ^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DragonCode\\Contracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + } + ], + "description": "A set of contracts for any project", + "keywords": [ + "contracts", + "interfaces" + ], + "support": { + "source": "https://github.com/TheDragonCode/contracts" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T21:50:20+00:00" + }, + { + "name": "dragon-code/pretty-array", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/TheDragonCode/pretty-array.git", + "reference": "b94034d92172a5d14a578822d68b2a8f8b5388e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TheDragonCode/pretty-array/zipball/b94034d92172a5d14a578822d68b2a8f8b5388e0", + "reference": "b94034d92172a5d14a578822d68b2a8f8b5388e0", + "shasum": "" + }, + "require": { + "dragon-code/contracts": "^2.20", + "dragon-code/support": "^6.11.2", + "ext-dom": "*", + "ext-mbstring": "*", + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^10.0 || ^11.0 || ^12.0" + }, + "suggest": { + "symfony/thanks": "Give thanks (in the form of a GitHub) to your fellow PHP package maintainers" + }, + "type": "library", + "autoload": { + "psr-4": { + "DragonCode\\PrettyArray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + } + ], + "description": "Simple conversion of an array to a pretty view", + "keywords": [ + "andrey helldar", + "array", + "dragon", + "dragon code", + "pretty", + "pretty array" + ], + "support": { + "issues": "https://github.com/TheDragonCode/pretty-array/issues", + "source": "https://github.com/TheDragonCode/pretty-array" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2025-02-24T15:35:24+00:00" + }, + { + "name": "dragon-code/support", + "version": "6.17.1", + "source": { + "type": "git", + "url": "https://github.com/TheDragonCode/support.git", + "reference": "82a465953267989883d64b921e9725600a5073b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TheDragonCode/support/zipball/82a465953267989883d64b921e9725600a5073b5", + "reference": "82a465953267989883d64b921e9725600a5073b5", + "shasum": "" + }, + "require": { + "dragon-code/contracts": "^2.22.0", + "ext-bcmath": "*", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.1", + "psr/http-message": "^1.0.1 || ^2.0", + "voku/portable-ascii": "^1.4.8 || ^2.0.1" + }, + "conflict": { + "andrey-helldar/support": "*" + }, + "require-dev": { + "illuminate/contracts": "^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "phpunit/phpunit": "^9.6 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.0 || ^7.0" + }, + "suggest": { + "dragon-code/laravel-support": "Various helper files for the Laravel and Lumen frameworks", + "symfony/thanks": "Give thanks (in the form of a GitHub) to your fellow PHP package maintainers" + }, + "type": "library", + "extra": { + "dragon-code": { + "docs-generator": { + "preview": { + "brand": "php", + "vendor": "The Dragon Code" + } + } + } + }, + "autoload": { + "psr-4": { + "DragonCode\\Support\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + } + ], + "description": "Support package is a collection of helpers and tools for any project.", + "keywords": [ + "dragon", + "dragon-code", + "framework", + "helper", + "helpers", + "laravel", + "php", + "support", + "symfony", + "yii", + "yii2" + ], + "support": { + "issues": "https://github.com/TheDragonCode/support/issues", + "source": "https://github.com/TheDragonCode/support" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-04-03T15:06:29+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel-lang/actions", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/actions.git", + "reference": "5e9bbd3b8af3fed4b733e424c56810b0d3e81377" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/actions/zipball/5e9bbd3b8af3fed4b733e424c56810b0d3e81377", + "reference": "5e9bbd3b8af3fed4b733e424c56810b0d3e81377", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel-lang/publisher": "^14.0 || ^15.0 || ^16.0", + "php": "^8.1" + }, + "require-dev": { + "laravel-lang/status-generator": "^2.3.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.3 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Actions\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Actions\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + }, + { + "name": "Laravel Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "Translation of buttons and other action elements", + "keywords": [ + "actions", + "buttons", + "lang", + "languages", + "laravel", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/actions/issues", + "source": "https://github.com/Laravel-Lang/actions/tree/1.13.2" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-05-30T12:11:11+00:00" + }, + { + "name": "laravel-lang/attributes", + "version": "2.16.4", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/attributes.git", + "reference": "4a0de72632bb1862532977fd76ed6be9c1cc65af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/attributes/zipball/4a0de72632bb1862532977fd76ed6be9c1cc65af", + "reference": "4a0de72632bb1862532977fd76ed6be9c1cc65af", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel-lang/publisher": "^14.0 || ^15.0 || ^16.0", + "php": "^8.1" + }, + "require-dev": { + "laravel-lang/status-generator": "^1.19 || ^2.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Attributes\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Attributes\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + } + ], + "description": "Translation of form element names", + "keywords": [ + "attributes", + "fields", + "form", + "lang", + "languages", + "laravel", + "messages", + "translations", + "validation" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/attributes/issues", + "source": "https://github.com/Laravel-Lang/attributes/tree/2.16.4" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-05-30T12:11:05+00:00" + }, + { + "name": "laravel-lang/common", + "version": "6.8.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/common.git", + "reference": "f1e3383f94c4f157f0f41324792382bf2dd84d52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/common/zipball/f1e3383f94c4f157f0f41324792382bf2dd84d52", + "reference": "f1e3383f94c4f157f0f41324792382bf2dd84d52", + "shasum": "" + }, + "require": { + "laravel-lang/actions": "^1.9", + "laravel-lang/attributes": "^2.12", + "laravel-lang/http-statuses": "^3.8", + "laravel-lang/json-fallback": "^2.2", + "laravel-lang/lang": "^13.12 || ^14.0 || ^15.5.1", + "laravel-lang/locales": "^2.10", + "laravel-lang/models": "^1.3", + "laravel-lang/moonshine": "^1.2", + "laravel-lang/publisher": "^16.5", + "laravel-lang/routes": "^1.7", + "laravel-lang/starter-kits": "^1.0", + "php": "^8.1" + }, + "require-dev": { + "dragon-code/support": "^6.13", + "orchestra/testbench": "^8.17 || ^9.1.2 || ^10.0 || ^11.0", + "phpunit/phpunit": "^10.5.20 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.4 || ^7.1.1 || ^8.0" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + }, + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + } + ], + "description": "Easily connect the necessary language packs to the application", + "keywords": [ + "Laravel-lang", + "actions", + "attribute", + "attributes", + "breeze", + "buttons", + "cashier", + "fortify", + "framework", + "http", + "http-status", + "http-status-code", + "i18n", + "jetstream", + "lang", + "language", + "languages", + "laravel", + "locale", + "locales", + "localization", + "localizations", + "moonshine", + "nova", + "publisher", + "spark", + "translation", + "translations", + "ui" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/common/issues", + "source": "https://github.com/Laravel-Lang/common" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T23:15:14+00:00" + }, + { + "name": "laravel-lang/config", + "version": "1.17.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/config.git", + "reference": "77ad089234aa74961ca30c7e6d13db9a62654c87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/config/zipball/77ad089234aa74961ca30c7e6d13db9a62654c87", + "reference": "77ad089234aa74961ca30c7e6d13db9a62654c87", + "shasum": "" + }, + "require": { + "archtechx/enums": "^1.0", + "illuminate/config": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/locale-list": "^1.6", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.23 || ^9.1 || ^10.0 || ^11.0", + "pestphp/pest": "^2.34 || ^3.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Config\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "The Laravel-Lang config package", + "keywords": [ + "Laravel-lang", + "Settings", + "config", + "lang", + "languages", + "laravel", + "locale", + "locales", + "localization", + "localizations", + "translation", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/config/issues", + "source": "https://github.com/Laravel-Lang/config/tree/1.17.0" + }, + "time": "2026-03-17T21:23:36+00:00" + }, + { + "name": "laravel-lang/http-statuses", + "version": "3.13.2", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/http-statuses.git", + "reference": "2d33c7b4f5b268224c559c27c1220764b5391ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/http-statuses/zipball/2d33c7b4f5b268224c559c27c1220764b5391ae2", + "reference": "2d33c7b4f5b268224c559c27c1220764b5391ae2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel-lang/publisher": "^14.1 || ^15.0 || ^16.0", + "php": "^8.1" + }, + "require-dev": { + "laravel-lang/status-generator": "^1.19 || ^2.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\HttpStatuses\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\HttpStatuses\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + } + ], + "description": "Translation of HTTP statuses", + "keywords": [ + "http", + "lang", + "languages", + "laravel", + "messages", + "status", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/http-statuses/issues", + "source": "https://github.com/Laravel-Lang/http-statuses/tree/3.13.2" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-05-30T12:11:06+00:00" + }, + { + "name": "laravel-lang/json-fallback", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/json-fallback.git", + "reference": "1b02c798da837c63e2d01f45b45bb49367d5b6a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/json-fallback/zipball/1b02c798da837c63e2d01f45b45bb49367d5b6a1", + "reference": "1b02c798da837c63e2d01f45b45bb49367d5b6a1", + "shasum": "" + }, + "require": { + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/translation": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "LaravelLang\\JsonFallback\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://github.com/andrey-helldar" + }, + { + "name": "Felipe Dsdev", + "homepage": "https://github.com/felipe-dsdev" + } + ], + "description": "Adds support for fallback JSON string translation", + "support": { + "issues": "https://github.com/Laravel-Lang/json-fallback/issues", + "source": "https://github.com/Laravel-Lang/json-fallback/tree/2.3.0" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T21:18:08+00:00" + }, + { + "name": "laravel-lang/lang", + "version": "15.33.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/lang.git", + "reference": "963488ac110876196c88630ea31594742f44358b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/lang/zipball/963488ac110876196c88630ea31594742f44358b", + "reference": "963488ac110876196c88630ea31594742f44358b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel-lang/publisher": "^16.0", + "php": "^8.2" + }, + "conflict": { + "laravel/framework": "<11.0.7" + }, + "require-dev": { + "dragon-code/codestyler": "^6.0", + "laravel-lang/status-generator": "^2.11", + "phpunit/phpunit": "^11.0 || ^12.0", + "symfony/var-dumper": "^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Lang\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Lang\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + } + ], + "description": "List of 126 languages for Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark and Laravel UI", + "keywords": [ + "lang", + "languages", + "laravel", + "lpm" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/lang/issues", + "source": "https://github.com/Laravel-Lang/lang" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-07-24T12:39:52+00:00" + }, + { + "name": "laravel-lang/locale-list", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/locale-list.git", + "reference": "48e61c7f0a957420d4aaf5d35653889c25c4e2d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/locale-list/zipball/48e61c7f0a957420d4aaf5d35653889c25c4e2d4", + "reference": "48e61c7f0a957420d4aaf5d35653889c25c4e2d4", + "shasum": "" + }, + "require": { + "archtechx/enums": "^0.3.2 || ^1.0", + "php": "^8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "LaravelLang\\LocaleList\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "List of localizations available in Laravel Lang projects", + "keywords": [ + "Laravel-lang", + "lang", + "languages", + "laravel", + "locale", + "locales", + "localization", + "translation", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/locale-list/issues", + "source": "https://github.com/Laravel-Lang/locale-list" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-01-20T08:17:15+00:00" + }, + { + "name": "laravel-lang/locales", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/locales.git", + "reference": "761aa3cfbc5bbe29eb958c9839e7dd3806193bac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/locales/zipball/761aa3cfbc5bbe29eb958c9839e7dd3806193bac", + "reference": "761aa3cfbc5bbe29eb958c9839e7dd3806193bac", + "shasum": "" + }, + "require": { + "archtechx/enums": "^0.3.2 || ^1.0", + "dragon-code/support": "^6.11.3", + "ext-json": "*", + "illuminate/collections": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/config": "^1.12", + "laravel-lang/locale-list": "^1.5", + "laravel-lang/native-country-names": "^1.5", + "laravel-lang/native-currency-names": "^1.6", + "laravel-lang/native-locale-names": "^2.5", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "pestphp/pest": "^2.24.1 || ^3.0 || ^4.0", + "symfony/var-dumper": "^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Locales\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Locales\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "Basic functionality for working with localizations", + "keywords": [ + "laravel", + "locale", + "locales", + "localization", + "translation", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/locales/issues", + "source": "https://github.com/Laravel-Lang/locales" + }, + "time": "2026-03-17T22:40:41+00:00" + }, + { + "name": "laravel-lang/models", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/models.git", + "reference": "a9aa0205ca019f4459ace26b0432b3b6d1886f66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/models/zipball/a9aa0205ca019f4459ace26b0432b3b6d1886f66", + "reference": "a9aa0205ca019f4459ace26b0432b3b6d1886f66", + "shasum": "" + }, + "require": { + "composer/class-map-generator": "^1.3", + "dragon-code/support": "^6.13", + "illuminate/database": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/config": "^1.12", + "laravel-lang/locales": "^2.10.0", + "laravel/prompts": ">=0.1", + "php": "^8.1" + }, + "require-dev": { + "laravel/pint": "^1.20", + "orchestra/testbench": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "pestphp/pest": "^2.34 || ^3.0 || ^4.0", + "pestphp/pest-plugin-laravel": "^2.4 || ^3.0 || ^4.0", + "symfony/var-dumper": "^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Models\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Models\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro", + "role": "Maintainer" + }, + { + "name": "Andrey Sokolov", + "email": "walfireru@gmail.com", + "homepage": "https://github.com/Quiss", + "role": "Usability consultant" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + } + ], + "description": "Easy and fast way to localize models", + "keywords": [ + "database", + "l18n", + "languages", + "laravel", + "locales", + "localization", + "models", + "translate", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/models/issues", + "source": "https://github.com/Laravel-Lang/models" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T23:00:20+00:00" + }, + { + "name": "laravel-lang/moonshine", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/moonshine.git", + "reference": "3927bcf658d392c9f2eb03c773f52ff650b37f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/moonshine/zipball/3927bcf658d392c9f2eb03c773f52ff650b37f63", + "reference": "3927bcf658d392c9f2eb03c773f52ff650b37f63", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel-lang/publisher": "^15.0 || ^16.4.1", + "php": "^8.1" + }, + "require-dev": { + "dragon-code/support": "^6.15.2", + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/lang": "^14.8 || ^15.14", + "laravel-lang/status-generator": "^2.12", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.3 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\MoonShine\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\MoonShine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "Translation for MoonShine admin panel", + "keywords": [ + "lang", + "languages", + "laravel", + "moonshine", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/moonshine/issues", + "source": "https://github.com/Laravel-Lang/moonshine/tree/1.9.2" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-05-30T12:11:41+00:00" + }, + { + "name": "laravel-lang/native-country-names", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/native-country-names.git", + "reference": "1d293138e34eb9e914bc4568cdebac2cb0a2eb0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/native-country-names/zipball/1d293138e34eb9e914bc4568cdebac2cb0a2eb0e", + "reference": "1d293138e34eb9e914bc4568cdebac2cb0a2eb0e", + "shasum": "" + }, + "require": { + "dragon-code/support": "^6.11", + "ext-json": "*", + "illuminate/collections": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/locale-list": "^1.5", + "pestphp/pest": "^2.0 || ^3.0 || ^4.0", + "punic/punic": "^3.8", + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/process": "^6.0 || ^7.0 || ^8.0", + "symfony/var-dumper": "^6.0 || ^7.0 || ^8.0", + "vlucas/phpdotenv": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "LaravelLang\\NativeCountryNames\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "The project contains native translations of country names", + "keywords": [ + "Laravel-lang", + "countries", + "country", + "lang", + "languages", + "laravel", + "locale", + "locales", + "localization", + "territories", + "territory", + "translation", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/native-country-names/issues", + "source": "https://github.com/Laravel-Lang/native-country-names" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T22:01:15+00:00" + }, + { + "name": "laravel-lang/native-currency-names", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/native-currency-names.git", + "reference": "7ebe95a9942bebf6afd61986fa18c82dade3d583" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/native-currency-names/zipball/7ebe95a9942bebf6afd61986fa18c82dade3d583", + "reference": "7ebe95a9942bebf6afd61986fa18c82dade3d583", + "shasum": "" + }, + "require": { + "dragon-code/support": "^6.11", + "ext-json": "*", + "illuminate/collections": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/locale-list": "^1.2", + "pestphp/pest": "^2.0 || ^3.0 || ^4.0", + "punic/punic": "^3.8", + "symfony/console": "^6.0 || ^7.0", + "symfony/process": "^6.0 || ^7.0", + "symfony/var-dumper": "^6.0 || ^7.0", + "vlucas/phpdotenv": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "LaravelLang\\NativeCurrencyNames\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "The project contains native translations of currency names", + "keywords": [ + "Laravel-lang", + "currency", + "lang", + "languages", + "laravel", + "locale", + "locales", + "localization", + "translation", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/native-currency-names/issues", + "source": "https://github.com/Laravel-Lang/native-currency-names" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-06-20T16:50:37+00:00" + }, + { + "name": "laravel-lang/native-locale-names", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/native-locale-names.git", + "reference": "e5925182bad34654203a5d93544357ca00a6d9c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/native-locale-names/zipball/e5925182bad34654203a5d93544357ca00a6d9c0", + "reference": "e5925182bad34654203a5d93544357ca00a6d9c0", + "shasum": "" + }, + "require": { + "dragon-code/support": "^6.11", + "ext-json": "*", + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/locale-list": "^1.2", + "pestphp/pest": "^2.24.3 || ^3.0 || ^4.0", + "punic/punic": "^3.8", + "symfony/console": "^6.0 || ^7.0", + "symfony/process": "^6.0 || ^7.0", + "symfony/var-dumper": "^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "LaravelLang\\NativeLocaleNames\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "The project contains native translations of locale names", + "keywords": [ + "Laravel-lang", + "lang", + "languages", + "laravel", + "locale", + "locales", + "localization", + "translation", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/native-locale-names/issues", + "source": "https://github.com/Laravel-Lang/native-locale-names" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-06-20T16:52:11+00:00" + }, + { + "name": "laravel-lang/publisher", + "version": "16.8.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/publisher.git", + "reference": "e5d3383f5385c2102f8a0d3dbe488ed86cd0250f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/publisher/zipball/e5d3383f5385c2102f8a0d3dbe488ed86cd0250f", + "reference": "e5d3383f5385c2102f8a0d3dbe488ed86cd0250f", + "shasum": "" + }, + "require": { + "composer/semver": "^3.4", + "dragon-code/pretty-array": "^4.1", + "dragon-code/support": "^6.11.3", + "ext-json": "*", + "illuminate/collections": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/console": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/config": "^1.12", + "laravel-lang/locales": "^2.10", + "league/commonmark": "^2.4.1", + "league/config": "^1.2", + "php": "^8.1" + }, + "conflict": { + "laravel-lang/attributes": "<2.0", + "laravel-lang/http-statuses": "<3.0", + "laravel-lang/lang": "<11.0" + }, + "require-dev": { + "laravel-lang/json-fallback": "^2.2", + "orchestra/testbench": "^8.14 || ^9.0 || ^10.0 || ^11.0", + "phpunit/phpunit": "^10.4.2 || ^11.0 || ^12.0", + "symfony/var-dumper": "^6.3.6 || ^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Publisher\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\Publisher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "Localization publisher for your Laravel application", + "keywords": [ + "Laravel-lang", + "breeze", + "cashier", + "fortify", + "framework", + "i18n", + "jetstream", + "lang", + "languages", + "laravel", + "locale", + "locales", + "localization", + "localizations", + "lpm", + "lumen", + "nova", + "publisher", + "spark", + "trans", + "translation", + "translations", + "validations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/publisher/issues", + "source": "https://github.com/Laravel-Lang/publisher" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T22:56:20+00:00" + }, + { + "name": "laravel-lang/routes", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/routes.git", + "reference": "29d7f83f2679f51187aa4e761d73bb4e0d133bf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/routes/zipball/29d7f83f2679f51187aa4e761d73bb4e0d133bf4", + "reference": "29d7f83f2679f51187aa4e761d73bb4e0d133bf4", + "shasum": "" + }, + "require": { + "codezero/browser-locale": "^3.4", + "dragon-code/support": "^6.13", + "illuminate/config": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/http": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/routing": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "laravel-lang/config": "^1.13", + "laravel-lang/locales": "^2.10", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.23 || ^9.1 || ^10.0 || ^11.0", + "pestphp/pest": "^2.34 || ^3.0 || ^4.0", + "pestphp/pest-plugin-laravel": "^2.4 || ^3.0 || ^4.0", + "symfony/var-dumper": "^6.0 || ^7.0 || ^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\Routes\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "helpers/functions.php" + ], + "psr-4": { + "LaravelLang\\Routes\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro", + "homepage": "https://dragon-code.pro" + }, + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + } + ], + "description": "Easy and fast way to localize routes", + "keywords": [ + "l18n", + "languages", + "laravel", + "localization", + "routes", + "translate", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/routes/issues", + "source": "https://github.com/Laravel-Lang/routes" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-03-17T23:06:16+00:00" + }, + { + "name": "laravel-lang/starter-kits", + "version": "1.16.1", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/starter-kits.git", + "reference": "87c00c77bbb73385d0526b35dbe07ea2bbfc32db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/starter-kits/zipball/87c00c77bbb73385d0526b35dbe07ea2bbfc32db", + "reference": "87c00c77bbb73385d0526b35dbe07ea2bbfc32db", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel-lang/publisher": "^16.6", + "php": "^8.1" + }, + "require-dev": { + "laravel-lang/status-generator": "^2.13", + "phpunit/phpunit": "^11.0 || ^12.0", + "symfony/var-dumper": "^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelLang\\StarterKits\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LaravelLang\\StarterKits\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrey Helldar", + "email": "helldar@dragon-code.pro" + }, + { + "name": "Laravel Lang Team", + "homepage": "https://laravel-lang.com" + } + ], + "description": "Translations for Laravel Starter Kits", + "keywords": [ + "i18n", + "lang", + "languages", + "laravel", + "starter-kit", + "starter-kits", + "translations" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/starter-kits/issues", + "source": "https://github.com/Laravel-Lang/starter-kits/tree/1.16.1" + }, + "funding": [ + { + "url": "https://boosty.to/dragon-code", + "type": "boosty" + }, + { + "url": "https://yoomoney.ru/to/410012608840929", + "type": "yoomoney" + } + ], + "time": "2026-07-16T18:13:26+00:00" + }, + { + "name": "laravel/agent-detector", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/agent-detector.git", + "reference": "90694b9256099591cf9e55d08c18ba7a00bf099f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/agent-detector/zipball/90694b9256099591cf9e55d08c18ba7a00bf099f", + "reference": "90694b9256099591cf9e55d08c18ba7a00bf099f", + "shasum": "" + }, + "require": { + "php": "^8.2.0" + }, + "require-dev": { + "laravel/pint": "^1.24.0", + "pestphp/pest": "^3.8.5|^4.1.0", + "pestphp/pest-plugin-type-coverage": "^3.0|^4.0.2", + "phpstan/phpstan": "^2.1.26", + "rector/rector": "^2.1.7", + "symfony/var-dumper": "^7.3.3" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Laravel\\AgentDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Detect if code is running in an AI agent or automated development environment", + "homepage": "https://github.com/laravel/agent-detector", + "keywords": [ + "Agent", + "ai", + "automation", + "claude", + "cursor", + "detection", + "devin", + "php" + ], + "support": { + "issues": "https://github.com/laravel/agent-detector/issues", + "source": "https://github.com/laravel/agent-detector" + }, + "time": "2026-04-29T18:32:34+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/2f7d27dada8effc48b8c424445a69cca7007daaa", + "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2026-05-20T22:24:57+00:00" + }, + { + "name": "laravel/pao", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/pao.git", + "reference": "41b3c61ebeddce52a446afe6d21e0b02983fb2f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pao/zipball/41b3c61ebeddce52a446afe6d21e0b02983fb2f6", + "reference": "41b3c61ebeddce52a446afe6d21e0b02983fb2f6", + "shasum": "" + }, + "require": { + "laravel/agent-detector": "^2.0.2", + "php": "^8.3" + }, + "conflict": { + "laravel/framework": "<12.0.0", + "nunomaduro/collision": "<8.9.3", + "pestphp/pest": "<4.6.3 || >=6.0.0", + "phpunit/phpunit": "<12.5.23 || >=13.0.0 <13.1.7 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.20.0", + "laravel/pint": "^1.29.1", + "orchestra/testbench": "^10.11.0 || ^11.1.0", + "pestphp/pest": "^4.7.2 || ^5.0.0", + "pestphp/pest-plugin-type-coverage": "^4.0.4 || ^5.0.0", + "phpstan/phpstan": "^2.2.2", + "rector/rector": "^2.4.5", + "symfony/process": "^7.4.8 || ^8.1.0", + "symfony/var-dumper": "^7.4.8 || ^8.1.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Laravel\\Pao\\Drivers\\Pest\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Laravel\\Pao\\Laravel\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Laravel\\Pao\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Agent-optimized output for PHP testing tools", + "keywords": [ + "Agent", + "PHPStan", + "ai", + "dev", + "paratest", + "pest", + "php", + "phpunit", + "rector", + "testing" + ], + "support": { + "issues": "https://github.com/laravel/pao/issues", + "source": "https://github.com/laravel/pao" + }, + "time": "2026-06-22T19:58:00+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.29.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "da1d1111a6aa2e082d2a388b194afe1ba0a05d14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/da1d1111a6aa2e082d2a388b194afe1ba0a05d14", + "reference": "da1d1111a6aa2e082d2a388b194afe1ba0a05d14", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.95.8", + "illuminate/view": "^12.62.0", + "larastan/larastan": "^3.10.0", + "laravel-zero/framework": "^12.1.0", + "laravel/agent-detector": "^2.0.2", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.6" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "dev", + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2026-06-16T15:34:04+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.9.5", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/fb53eacd509a1d303858e2d20cfebf2d630254ec", + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", + "php": "^8.2.0", + "symfony/console": "^7.4.14 || ^8.1.1" + }, + "conflict": { + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.10.0", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.20.0", + "laravel/pint": "^1.29.3", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.3.5", + "pestphp/pest": "^3.8.5 || ^4.7.5 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.1.2 || ^9.3.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-07-15T19:09:14+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "12.5.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "186dab580576598076de6818596d12b61801880e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", + "reference": "186dab580576598076de6818596d12b61801880e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.1.2", + "sebastian/lines-of-code": "^4.0.1", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.28" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-06-01T13:24:19+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T14:04:18+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.5.31", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "0608d157a284f15cc73b99a3327eff06b66a176d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0608d157a284f15cc73b99a3327eff06b66a176d", + "reference": "0608d157a284f15cc73b99a3327eff06b66a176d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.1", + "sebastian/comparator": "^7.1.8", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.1.2", + "sebastian/exporter": "^7.0.3", + "sebastian/global-state": "^8.0.3", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.4", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.31" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsoring.html", + "type": "other" + } + ], + "time": "2026-07-06T14:54:16+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" + } + ], + "time": "2026-05-17T05:29:34+00:00" + }, + { + "name": "sebastian/comparator", + "version": "7.1.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "7c65c1e79836812819705b473a90c12399542485" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", + "reference": "7c65c1e79836812819705b473a90c12399542485", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-05-21T04:45:25+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "8.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.26" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:40:20+00:00" + }, + { + "name": "sebastian/exporter", + "version": "7.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2026-05-20T04:37:17+00:00" + }, + { + "name": "sebastian/global-state", + "version": "8.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0.1" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.5.28" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2026-06-01T15:10:33+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.7.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" + } + ], + "time": "2026-05-19T16:22:07+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:48+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:17+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:44:59+00:00" + }, + { + "name": "sebastian/type", + "version": "6.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "82ff822c2edc46724be9f7411d3163021f602773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", + "reference": "82ff822c2edc46724be9f7411d3163021f602773", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2026-05-20T06:45:45+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-12-08T11:19:18+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.3" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..423eed5 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..24d8311 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,122 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + + 'api' => [ + 'driver' => 'passport', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..d7eec61 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,136 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "storage", "octane", + | "session", "failover", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'storage' => [ + 'driver' => 'storage', + 'disk' => env('CACHE_STORAGE_DISK'), + 'path' => env('CACHE_STORAGE_PATH', 'framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + + /* + |-------------------------------------------------------------------------- + | Serializable Classes + |-------------------------------------------------------------------------- + | + | This value determines the classes that can be unserialized from cache + | storage. By default, no PHP classes will be unserialized from your + | cache to prevent gadget chain attacks if your APP_KEY is leaked. + | + */ + + 'serializable_classes' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..abbb88e --- /dev/null +++ b/config/database.php @@ -0,0 +1,184 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + 'transaction_mode' => 'DEFERRED', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + Mysql::ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + Mysql::ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => env('DB_SSLMODE', 'prefer'), + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..37d8fca --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/l5-swagger.php b/config/l5-swagger.php new file mode 100644 index 0000000..ff4c8a4 --- /dev/null +++ b/config/l5-swagger.php @@ -0,0 +1,333 @@ + 'default', + 'documentations' => [ + 'default' => [ + 'api' => [ + 'title' => 'L5 Swagger UI', + ], + + 'routes' => [ + /* + * Route for accessing api documentation interface + */ + 'api' => 'api/documentation', + ], + 'paths' => [ + /* + * Edit to include full URL in ui for assets + */ + 'use_absolute_path' => env('L5_SWAGGER_USE_ABSOLUTE_PATH', true), + + /* + * Edit to set path where swagger ui assets should be stored + */ + 'swagger_ui_assets_path' => env('L5_SWAGGER_UI_ASSETS_PATH', 'vendor/swagger-api/swagger-ui/dist/'), + + /* + * File name of the generated json documentation file + */ + 'docs_json' => 'api-docs.json', + + /* + * File name of the generated YAML documentation file + */ + 'docs_yaml' => 'api-docs.yaml', + + /* + * Set this to `json` or `yaml` to determine which documentation file to use in UI + */ + 'format_to_use_for_docs' => env('L5_FORMAT_TO_USE_FOR_DOCS', 'json'), + + /* + * Absolute paths to directory containing the swagger annotations are stored. + */ + 'annotations' => [ + base_path('app'), + ], + ], + ], + ], + 'defaults' => [ + 'routes' => [ + /* + * Route for accessing parsed swagger annotations. + */ + 'docs' => 'docs', + + /* + * Route for Oauth2 authentication callback. + */ + 'oauth2_callback' => 'api/oauth2-callback', + + /* + * Middleware allows to prevent unexpected access to API documentation + */ + 'middleware' => [ + 'api' => [], + 'asset' => [], + 'docs' => [], + 'oauth2_callback' => [], + ], + + /* + * Route Group options + */ + 'group_options' => [], + ], + + 'paths' => [ + /* + * Absolute path to location where parsed annotations will be stored + */ + 'docs' => storage_path('api-docs'), + + /* + * Absolute path to directory where to export views + */ + 'views' => base_path('resources/views/vendor/l5-swagger'), + + /* + * Edit to set the api's base path + */ + 'base' => env('L5_SWAGGER_BASE_PATH', null), + + /* + * Absolute path to directories that should be excluded from scanning + * @deprecated Please use `scanOptions.exclude` + * `scanOptions.exclude` overwrites this + */ + 'excludes' => [], + ], + + 'scanOptions' => [ + /** + * Optional CustomGeneratorInterface implementation that creates an OpenApi\Generator instance. + * Use this to provide a custom pre-configured generator. + * Accepts an instance or a class name (FQCN) implementing the interface. + * + * @see \L5Swagger\CustomGeneratorInterface + */ + 'generator_factory' => null, + + /** + * Configuration for default processors. Allows to pass processors configuration to swagger-php. + * + * @link https://zircote.github.io/swagger-php/reference/processors.html + */ + 'default_processors_configuration' => [ + /** Example */ + /** + * 'operationId.hash' => true, + * 'pathFilter' => [ + * 'tags' => [ + * '/pets/', + * '/store/', + * ], + * ],. + */ + ], + + /** + * analyser: defaults to \OpenApi\StaticAnalyser . + * + * @see \OpenApi\scan + */ + 'analyser' => null, + + /** + * analysis: defaults to a new \OpenApi\Analysis . + * + * @see \OpenApi\scan + */ + 'analysis' => null, + + /** + * Custom processors. + * + * Each entry can be: + * - A class name or instance (inserted after BuildPaths by default) + * - An array with 'class' and 'after' keys for precise positioning: + * ['class' => MyProcessor::class, 'after' => SomeProcessor::class] + * + * @link https://github.com/zircote/swagger-php/tree/master/Examples/processors/schema-query-parameter + * @see \OpenApi\scan + */ + 'processors' => [ + // \App\SwaggerProcessors\SchemaQueryParameter::class, + // ['class' => \App\SwaggerProcessors\Custom::class, 'after' => \OpenApi\Processors\AugmentSchemas::class], + ], + + /** + * pattern: string $pattern File pattern(s) to scan (default: *.php) . + * + * @see \OpenApi\scan + */ + 'pattern' => null, + + /* + * Absolute path to directories that should be excluded from scanning + * @note This option overwrites `paths.excludes` + * @see \OpenApi\scan + */ + 'exclude' => [], + + /* + * Allows to generate specs either for OpenAPI 3.0.0 or OpenAPI 3.1.0. + * By default the spec will be in version 3.0.0 + */ + 'open_api_spec_version' => env('L5_SWAGGER_OPEN_API_SPEC_VERSION', \L5Swagger\Generator::OPEN_API_DEFAULT_SPEC_VERSION), + ], + + /* + * API security definitions. Will be generated into documentation file. + */ + 'securityDefinitions' => [ + 'securitySchemes' => [ + /* + * Examples of Security schemes + */ + /* + 'api_key_security_example' => [ // Unique name of security + 'type' => 'apiKey', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2". + 'description' => 'A short description for security scheme', + 'name' => 'api_key', // The name of the header or query parameter to be used. + 'in' => 'header', // The location of the API key. Valid values are "query" or "header". + ], + 'oauth2_security_example' => [ // Unique name of security + 'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2". + 'description' => 'A short description for oauth2 security scheme.', + 'flow' => 'implicit', // The flow used by the OAuth2 security scheme. Valid values are "implicit", "password", "application" or "accessCode". + 'authorizationUrl' => 'http://example.com/auth', // The authorization URL to be used for (implicit/accessCode) + //'tokenUrl' => 'http://example.com/auth' // The authorization URL to be used for (password/application/accessCode) + 'scopes' => [ + 'read:projects' => 'read your projects', + 'write:projects' => 'modify projects in your account', + ] + ], + */ + + /* Open API 3.0 support + 'passport' => [ // Unique name of security + 'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2". + 'description' => 'Laravel passport oauth2 security.', + 'in' => 'header', + 'scheme' => 'https', + 'flows' => [ + "password" => [ + "authorizationUrl" => config('app.url') . '/oauth/authorize', + "tokenUrl" => config('app.url') . '/oauth/token', + "refreshUrl" => config('app.url') . '/token/refresh', + "scopes" => [] + ], + ], + ], + 'sanctum' => [ // Unique name of security + 'type' => 'apiKey', // Valid values are "basic", "apiKey" or "oauth2". + 'description' => 'Enter token in format (Bearer )', + 'name' => 'Authorization', // The name of the header or query parameter to be used. + 'in' => 'header', // The location of the API key. Valid values are "query" or "header". + ], + */ + ], + 'security' => [ + /* + * Examples of Securities + */ + [ + /* + 'oauth2_security_example' => [ + 'read', + 'write' + ], + + 'passport' => [] + */ + ], + ], + ], + + /* + * Set this to `true` in development mode so that docs would be regenerated on each request + * Set this to `false` to disable swagger generation on production + */ + 'generate_always' => env('L5_SWAGGER_GENERATE_ALWAYS', false), + + /* + * Set this to `true` to generate a copy of documentation in yaml format + */ + 'generate_yaml_copy' => env('L5_SWAGGER_GENERATE_YAML_COPY', false), + + /* + * Edit to trust the proxy's ip address - needed for AWS Load Balancer + * string[] + */ + 'proxy' => false, + + /* + * Configs plugin allows to fetch external configs instead of passing them to SwaggerUIBundle. + * See more at: https://github.com/swagger-api/swagger-ui#configs-plugin + */ + 'additional_config_url' => null, + + /* + * Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically), + * 'method' (sort by HTTP method). + * Default is the order returned by the server unchanged. + */ + 'operations_sort' => env('L5_SWAGGER_OPERATIONS_SORT', null), + + /* + * Pass the validatorUrl parameter to SwaggerUi init on the JS side. + * A null value here disables validation. + */ + 'validator_url' => null, + + /* + * Swagger UI configuration parameters + */ + 'ui' => [ + 'display' => [ + 'dark_mode' => env('L5_SWAGGER_UI_DARK_MODE', false), + /* + * Controls the default expansion setting for the operations and tags. It can be : + * 'list' (expands only the tags), + * 'full' (expands the tags and operations), + * 'none' (expands nothing). + */ + 'doc_expansion' => env('L5_SWAGGER_UI_DOC_EXPANSION', 'none'), + + /** + * If set, enables filtering. The top bar will show an edit box that + * you can use to filter the tagged operations that are shown. Can be + * Boolean to enable or disable, or a string, in which case filtering + * will be enabled using that string as the filter expression. Filtering + * is case-sensitive matching the filter expression anywhere inside + * the tag. + */ + 'filter' => env('L5_SWAGGER_UI_FILTERS', true), // true | false + ], + + 'authorization' => [ + /* + * If set to true, it persists authorization data, and it would not be lost on browser close/refresh + */ + 'persist_authorization' => env('L5_SWAGGER_UI_PERSIST_AUTHORIZATION', false), + + 'oauth2' => [ + /* + * If set to true, adds PKCE to AuthorizationCodeGrant flow + */ + 'use_pkce_with_authorization_code_grant' => false, + ], + ], + ], + /* + * Constants which can be used in annotations + */ + 'constants' => [ + 'L5_SWAGGER_CONST_HOST' => env('L5_SWAGGER_CONST_HOST', 'http://my-default-host.com'), + ], + ], +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..b09cb25 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..e32e88d --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')), + ], + +]; diff --git a/config/passport.php b/config/passport.php new file mode 100644 index 0000000..aed4358 --- /dev/null +++ b/config/passport.php @@ -0,0 +1,48 @@ + 'web', + + 'middleware' => [], + + /* + |-------------------------------------------------------------------------- + | Encryption Keys + |-------------------------------------------------------------------------- + | + | Passport uses encryption keys while generating secure access tokens for + | your application. By default, the keys are stored as local files but + | can be set via environment variables when that is more convenient. + | + */ + + 'private_key' => env('PASSPORT_PRIVATE_KEY'), + + 'public_key' => env('PASSPORT_PUBLIC_KEY'), + + /* + |-------------------------------------------------------------------------- + | Passport Database Connection + |-------------------------------------------------------------------------- + | + | By default, Passport's models will utilize your application's default + | database connection. If you wish to use a different connection you + | may specify the configured name of the database connection here. + | + */ + + 'connection' => env('PASSPORT_CONNECTION'), + +]; diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 0000000..8f1f452 --- /dev/null +++ b/config/permission.php @@ -0,0 +1,219 @@ + [ + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * Eloquent model should be used to retrieve your permissions. Of course, it + * is often just the "Permission" model but you may use whatever you like. + * + * The model you want to use as a Permission model needs to implement the + * `Spatie\Permission\Contracts\Permission` contract. + */ + + 'permission' => Permission::class, + + /* + * When using the "HasRoles" trait from this package, we need to know which + * Eloquent model should be used to retrieve your roles. Of course, it + * is often just the "Role" model but you may use whatever you like. + * + * The model you want to use as a Role model needs to implement the + * `Spatie\Permission\Contracts\Role` contract. + */ + + 'role' => Role::class, + + /* + * When using the "Teams" feature from this package, we need to know which + * Eloquent model should be used to retrieve your teams. Of course, it + * is often just the "Team" model but you may use whatever you like. + */ + 'team' => null, + + /* + * When using the "HasModels" trait and passing raw IDs to syncModels, + * attachModels, or detachModels, this model class will be used to + * resolve those IDs. If null, defaults to the guard's model. + */ + 'default_model' => null, + ], + + 'table_names' => [ + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'roles' => 'roles', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your permissions. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'permissions' => 'permissions', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your models permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_permissions' => 'model_has_permissions', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your models roles. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_roles' => 'model_has_roles', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'role_has_permissions' => 'role_has_permissions', + ], + + 'column_names' => [ + /* + * Change this if you want to name the related pivots other than defaults + */ + 'role_pivot_key' => null, // default 'role_id', + 'permission_pivot_key' => null, // default 'permission_id', + + /* + * Change this if you want to name the related model primary key other than + * `model_id`. + * + * For example, this would be nice if your primary keys are all UUIDs. In + * that case, name this `model_uuid`. + */ + + 'model_morph_key' => 'model_id', + + /* + * Change this if you want to use the teams feature and your related model's + * foreign key is other than `team_id`. + */ + + 'team_foreign_key' => 'team_id', + ], + + /* + * When set to true, the method for checking permissions will be registered on the gate. + * Set this to false if you want to implement custom logic for checking permissions. + */ + + 'register_permission_check_method' => true, + + /* + * When set to true, Laravel\Octane\Events\OperationTerminated event listener will be registered + * this will refresh permissions on every TickTerminated, TaskTerminated and RequestTerminated + * NOTE: This should not be needed in most cases, but an Octane/Vapor combination benefited from it. + */ + 'register_octane_reset_listener' => false, + + /* + * Events will fire when a role or permission is assigned/unassigned: + * \Spatie\Permission\Events\RoleAttachedEvent + * \Spatie\Permission\Events\RoleDetachedEvent + * \Spatie\Permission\Events\PermissionAttachedEvent + * \Spatie\Permission\Events\PermissionDetachedEvent + * + * To enable, set to true, and then create listeners to watch these events. + */ + 'events_enabled' => false, + + /* + * Teams Feature. + * When set to true the package implements teams using the 'team_foreign_key'. + * If you want the migrations to register the 'team_foreign_key', you must + * set this to true before doing the migration. + * If you already did the migration then you must make a new migration to also + * add 'team_foreign_key' to 'roles', 'model_has_roles', and 'model_has_permissions' + * (view the latest version of this package's migration file) + */ + + 'teams' => false, + + /* + * The class to use to resolve the permissions team id + */ + 'team_resolver' => DefaultTeamResolver::class, + + /* + * Passport Client Credentials Grant + * When set to true the package will use Passports Client to check permissions + */ + + 'use_passport_client_credentials' => false, + + /* + * When set to true, the required permission names are added to exception messages. + * This could be considered an information leak in some contexts, so the default + * setting is false here for optimum safety. + */ + + 'display_permission_in_exception' => false, + + /* + * When set to true, the required role names are added to exception messages. + * This could be considered an information leak in some contexts, so the default + * setting is false here for optimum safety. + */ + + 'display_role_in_exception' => false, + + /* + * By default wildcard permission lookups are disabled. + * See documentation to understand supported syntax. + */ + + 'enable_wildcard_permission' => false, + + /* + * The class to use for interpreting wildcard permissions. + * If you need to modify delimiters, override the class and specify its name here. + */ + // 'wildcard_permission' => Spatie\Permission\WildcardPermission::class, + + /* Cache-specific settings */ + + 'cache' => [ + + /* + * By default all permissions are cached for 24 hours to speed up performance. + * When permissions or roles are updated the cache is flushed automatically. + */ + + 'expiration_time' => DateInterval::createFromDateString('24 hours'), + + /* + * The cache key used to store all permissions. + */ + + 'key' => 'spatie.permission.cache', + + /* + * You may optionally indicate a specific cache driver to use for permission and + * role caching using any of the `store` drivers listed in the cache.php config + * file. Using 'default' here means to use the `default` set in cache.php. + */ + + 'store' => 'default', + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..79c2c0a --- /dev/null +++ b/config/queue.php @@ -0,0 +1,129 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", + | "deferred", "background", "failover", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'background' => [ + 'driver' => 'background', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6a90eb8 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'key' => env('POSTMARK_API_KEY'), + ], + + 'resend' => [ + 'key' => env('RESEND_API_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..f574482 --- /dev/null +++ b/config/session.php @@ -0,0 +1,233 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain without subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + + /* + |-------------------------------------------------------------------------- + | Session Serialization + |-------------------------------------------------------------------------- + | + | This value controls the serialization strategy for session data, which + | is JSON by default. Setting this to "php" allows the storage of PHP + | objects in the session but can make an application vulnerable to + | "gadget chain" serialization attacks if the APP_KEY is leaked. + | + | Supported: "json", "php" + | + */ + + 'serialization' => 'json', + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..c4ceb07 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,45 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..05fb5d9 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..06dc7a5 --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->bigInteger('expiration')->index(); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->bigInteger('expiration')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..edac6fe --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,59 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedSmallInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->string('connection'); + $table->string('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + + $table->index(['connection', 'queue', 'failed_at']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2026_07_24_225144_create_oauth_auth_codes_table.php b/database/migrations/2026_07_24_225144_create_oauth_auth_codes_table.php new file mode 100644 index 0000000..c700b50 --- /dev/null +++ b/database/migrations/2026_07_24_225144_create_oauth_auth_codes_table.php @@ -0,0 +1,39 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->index(); + $table->foreignUuid('client_id'); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_auth_codes'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/database/migrations/2026_07_24_225145_create_oauth_access_tokens_table.php b/database/migrations/2026_07_24_225145_create_oauth_access_tokens_table.php new file mode 100644 index 0000000..3e50f7f --- /dev/null +++ b/database/migrations/2026_07_24_225145_create_oauth_access_tokens_table.php @@ -0,0 +1,41 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->foreignUuid('client_id'); + $table->string('name')->nullable(); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->timestamps(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_access_tokens'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/database/migrations/2026_07_24_225146_create_oauth_refresh_tokens_table.php b/database/migrations/2026_07_24_225146_create_oauth_refresh_tokens_table.php new file mode 100644 index 0000000..afb3c55 --- /dev/null +++ b/database/migrations/2026_07_24_225146_create_oauth_refresh_tokens_table.php @@ -0,0 +1,37 @@ +char('id', 80)->primary(); + $table->char('access_token_id', 80)->index(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_refresh_tokens'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/database/migrations/2026_07_24_225147_create_oauth_clients_table.php b/database/migrations/2026_07_24_225147_create_oauth_clients_table.php new file mode 100644 index 0000000..9794dc8 --- /dev/null +++ b/database/migrations/2026_07_24_225147_create_oauth_clients_table.php @@ -0,0 +1,42 @@ +uuid('id')->primary(); + $table->nullableMorphs('owner'); + $table->string('name'); + $table->string('secret')->nullable(); + $table->string('provider')->nullable(); + $table->text('redirect_uris'); + $table->text('grant_types'); + $table->boolean('revoked'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_clients'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/database/migrations/2026_07_24_225148_create_oauth_device_codes_table.php b/database/migrations/2026_07_24_225148_create_oauth_device_codes_table.php new file mode 100644 index 0000000..ea07831 --- /dev/null +++ b/database/migrations/2026_07_24_225148_create_oauth_device_codes_table.php @@ -0,0 +1,42 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->foreignUuid('client_id')->index(); + $table->char('user_code', 8)->unique(); + $table->text('scopes'); + $table->boolean('revoked'); + $table->dateTime('user_approved_at')->nullable(); + $table->dateTime('last_polled_at')->nullable(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_device_codes'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/database/migrations/2026_07_24_233201_create_permission_tables.php b/database/migrations/2026_07_24_233201_create_permission_tables.php new file mode 100644 index 0000000..8986275 --- /dev/null +++ b/database/migrations/2026_07_24_233201_create_permission_tables.php @@ -0,0 +1,137 @@ +id(); // permission id + $table->string('name'); + $table->string('guard_name'); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + /** + * See `docs/prerequisites.md` for suggested lengths on 'name' and 'guard_name' if "1071 Specified key was too long" errors are encountered. + */ + Schema::create($tableNames['roles'], static function (Blueprint $table) use ($teams, $columnNames) { + $table->id(); // role id + if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing + $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable(); + $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index'); + } + $table->string('name'); + $table->string('guard_name'); + $table->timestamps(); + if ($teams || config('permission.testing')) { + $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']); + } else { + $table->unique(['name', 'guard_name']); + } + }); + + Schema::create($tableNames['model_has_permissions'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) { + $table->unsignedBigInteger($pivotPermission); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index'); + + $table->foreign($pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->cascadeOnDelete(); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } else { + $table->primary([$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } + }); + + Schema::create($tableNames['model_has_roles'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) { + $table->unsignedBigInteger($pivotRole); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index'); + + $table->foreign($pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->cascadeOnDelete(); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } else { + $table->primary([$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } + }); + + Schema::create($tableNames['role_has_permissions'], static function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) { + $table->unsignedBigInteger($pivotPermission); + $table->unsignedBigInteger($pivotRole); + + $table->foreign($pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->cascadeOnDelete(); + + $table->foreign($pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->cascadeOnDelete(); + + $table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary'); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + $tableNames = config('permission.table_names'); + + throw_if(empty($tableNames), 'Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + + Schema::dropIfExists($tableNames['role_has_permissions']); + Schema::dropIfExists($tableNames['model_has_roles']); + Schema::dropIfExists($tableNames['model_has_permissions']); + Schema::dropIfExists($tableNames['roles']); + Schema::dropIfExists($tableNames['permissions']); + } +}; diff --git a/database/migrations/2026_07_24_233203_add_is_active_to_users_table.php b/database/migrations/2026_07_24_233203_add_is_active_to_users_table.php new file mode 100644 index 0000000..b2fa208 --- /dev/null +++ b/database/migrations/2026_07_24_233203_add_is_active_to_users_table.php @@ -0,0 +1,28 @@ +boolean('is_active')->default(true)->after('password'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('is_active'); + }); + } +}; diff --git a/database/migrations/2026_07_25_085110_create_app_user_roles_table.php b/database/migrations/2026_07_25_085110_create_app_user_roles_table.php new file mode 100644 index 0000000..d8fa3d9 --- /dev/null +++ b/database/migrations/2026_07_25_085110_create_app_user_roles_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->foreignUuid('client_id')->constrained('oauth_clients')->cascadeOnDelete(); + $table->string('role'); + $table->timestamps(); + + $table->unique(['user_id', 'client_id', 'role']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('app_user_roles'); + } +}; diff --git a/database/migrations/2026_07_25_100506_create_login_events_table.php b/database/migrations/2026_07_25_100506_create_login_events_table.php new file mode 100644 index 0000000..0973ab1 --- /dev/null +++ b/database/migrations/2026_07_25_100506_create_login_events_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); + $table->foreignUuid('client_id')->nullable()->constrained('oauth_clients')->nullOnDelete(); + $table->string('type'); // 'session' (panel admin) | 'oauth' (token emitido para una app) + $table->string('ip_address', 45)->nullable(); + $table->string('user_agent')->nullable(); + $table->timestamp('created_at')->nullable(); + + $table->index(['created_at']); + $table->index(['client_id', 'created_at']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('login_events'); + } +}; diff --git a/database/migrations/2026_07_25_114228_add_deleted_at_to_users_table.php b/database/migrations/2026_07_25_114228_add_deleted_at_to_users_table.php new file mode 100644 index 0000000..f3bc08c --- /dev/null +++ b/database/migrations/2026_07_25_114228_add_deleted_at_to_users_table.php @@ -0,0 +1,28 @@ +softDeletes()->after('is_active'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +}; diff --git a/database/migrations/2026_07_25_190704_add_approved_at_to_users_table.php b/database/migrations/2026_07_25_190704_add_approved_at_to_users_table.php new file mode 100644 index 0000000..49805c6 --- /dev/null +++ b/database/migrations/2026_07_25_190704_add_approved_at_to_users_table.php @@ -0,0 +1,37 @@ +timestamp('approved_at')->nullable()->after('is_active'); + }); + + // Los usuarios que ya existían antes de este cambio quedan aprobados + // (si no, todos se bloquean de golpe la primera vez que se corre esto). + DB::table('users')->whereNull('approved_at')->update(['approved_at' => now()]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('approved_at'); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..93a0c1a --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,170 @@ +call(RolesAndPermissionsSeeder::class); + + $adminUser = User::firstOrCreate( + ['email' => 'admin@example.com'], + ['name' => 'Admin', 'password' => Hash::make('password'), 'approved_at' => now()] + ); + $adminUser->syncRoles(['admin']); + + // Usuarios extra solo para que las analíticas (sección "usuarios más activos") + // tengan algo interesante que mostrar de entrada. + $extraUsers = collect([ + ['name' => 'Carla Gómez', 'email' => 'carla@example.com'], + ['name' => 'Martín Ruiz', 'email' => 'martin@example.com'], + ['name' => 'Bea Fernández', 'email' => 'bea@example.com'], + ])->map(function (array $data) { + $u = User::firstOrCreate(['email' => $data['email']], ['name' => $data['name'], 'password' => Hash::make('password'), 'approved_at' => now()]); + $u->syncRoles(['user']); + + return $u; + }); + + // Usuario de ejemplo que se autorregistró y todavía nadie aprobó, para + // que la pestaña "Pendientes" del panel de usuarios no arranque vacía. + User::firstOrCreate( + ['email' => 'nuevo@example.com'], + ['name' => 'Nuevo Registro', 'password' => Hash::make('password'), 'approved_at' => null] + )->assignRole('user'); + + // Cliente requerido para poder emitir Personal Access Tokens (grant "personal_access"). + if (! Client::where('personal_access_client', true)->exists()) { + $clients->createPersonalAccessGrantClient('Personal Access Client'); + } + + // Cliente de demo para el flujo Authorization Code + PKCE (público, sin secret). + $pkceClient = $adminUser->oauthApps()->firstOrCreate( + ['name' => 'Demo SPA (Authorization Code + PKCE)'], + [ + 'secret' => null, + 'redirect_uris' => ['http://localhost:8000/callback'], + 'grant_types' => ['authorization_code', 'refresh_token'], + 'revoked' => false, + ] + ); + + // Cliente de demo para Client Credentials (machine-to-machine). + $ccClient = $adminUser->oauthApps()->firstOrCreate( + ['name' => 'Demo Service (Client Credentials)'], + [ + 'secret' => Str::random(40), + 'redirect_uris' => [], + 'grant_types' => ['client_credentials'], + 'revoked' => false, + ] + ); + + // Cliente de demo para Password Grant. + $pwClient = $adminUser->oauthApps()->firstOrCreate( + ['name' => 'Demo First-Party App (Password Grant)'], + [ + 'secret' => Str::random(40), + 'redirect_uris' => [], + 'grant_types' => ['password', 'refresh_token'], + 'revoked' => false, + ] + ); + + // Cliente confidencial para probar el botón "Authorize" de Swagger UI + // (usa /api/oauth2-callback, que ya registra L5-Swagger). + $swaggerClient = $adminUser->oauthApps()->firstOrCreate( + ['name' => 'Swagger UI'], + [ + 'secret' => Str::random(40), + 'redirect_uris' => [rtrim(config('app.url'), '/').'/api/oauth2-callback'], + 'grant_types' => ['authorization_code', 'client_credentials', 'refresh_token'], + 'revoked' => false, + ] + ); + + // Rol por-app de ejemplo: carla@example.com es "admin" dentro de la app + // "Demo SPA", aunque globalmente sea un usuario normal. Muestra que el + // rol puede variar según qué app pregunte por el usuario. + DB::table('app_user_roles')->insertOrIgnore([ + 'user_id' => $extraUsers->first()->id, + 'client_id' => $pkceClient->id, + 'role' => 'admin', + 'created_at' => now(), + 'updated_at' => now(), + ]); + + if (! LoginEvent::query()->exists()) { + $this->seedLoginEvents( + $extraUsers->push($adminUser), + collect([$pkceClient, $ccClient, $pwClient, $swaggerClient]), + ); + } + + $this->command?->info('Admin: admin@example.com / password'); + $this->command?->info('Client Credentials -> client_id: '.$ccClient->id.' secret: '.($ccClient->plainSecret ?? '(ya existía, ver DB)')); + $this->command?->info('Password Grant -> client_id: '.$pwClient->id.' secret: '.($pwClient->plainSecret ?? '(ya existía, ver DB)')); + $this->command?->info('Swagger UI -> client_id: '.$swaggerClient->id.' secret: '.($swaggerClient->plainSecret ?? '(ya existía, ver DB)')); + } + + /** + * Historial sintético de logins (últimos 30 días) para que la pantalla de + * analíticas tenga algo real que graficar apenas se levanta la app. + * + * @param \Illuminate\Support\Collection $users + * @param \Illuminate\Support\Collection $clients + */ + private function seedLoginEvents($users, $clients): void + { + $rows = []; + + $now = now(); + + for ($daysAgo = 29; $daysAgo >= 0; $daysAgo--) { + $dayStart = $now->copy()->subDays($daysAgo)->startOfDay(); + $maxMinute = $daysAgo === 0 ? $now->diffInMinutes($dayStart) : 1439; + $isWeekend = $dayStart->isWeekend(); + $oauthLogins = random_int($isWeekend ? 1 : 4, $isWeekend ? 6 : 14); + $sessionLogins = random_int($isWeekend ? 0 : 1, $isWeekend ? 2 : 5); + + for ($i = 0; $i < $oauthLogins; $i++) { + $rows[] = [ + 'user_id' => $users->random()->id, + 'client_id' => $clients->random()->id, + 'type' => 'oauth', + 'ip_address' => '10.0.'.random_int(0, 9).'.'.random_int(2, 254), + 'user_agent' => 'Mozilla/5.0 (demo seed)', + 'created_at' => $dayStart->copy()->addMinutes(random_int(0, max(0, $maxMinute))), + ]; + } + + for ($i = 0; $i < $sessionLogins; $i++) { + $rows[] = [ + 'user_id' => $users->random()->id, + 'client_id' => null, + 'type' => 'session', + 'ip_address' => '10.0.'.random_int(0, 9).'.'.random_int(2, 254), + 'user_agent' => 'Mozilla/5.0 (demo seed)', + 'created_at' => $dayStart->copy()->addMinutes(random_int(0, max(0, $maxMinute))), + ]; + } + } + + foreach (array_chunk($rows, 200) as $chunk) { + LoginEvent::insert($chunk); + } + } +} diff --git a/database/seeders/RolesAndPermissionsSeeder.php b/database/seeders/RolesAndPermissionsSeeder.php new file mode 100644 index 0000000..3b66af0 --- /dev/null +++ b/database/seeders/RolesAndPermissionsSeeder.php @@ -0,0 +1,27 @@ +syncPermissions(Permission::all()); + Role::findOrCreate('user'); + } +} diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..e8acfbf --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,102 @@ +name: oauth-iam + +services: + app: + build: + context: . + target: app + image: oauth-iam-app:latest + restart: unless-stopped + environment: + CONTAINER_ROLE: app + env_file: .env.production + volumes: + - app_storage:/var/www/html/storage + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + healthcheck: + test: ["CMD", "nc", "-z", "127.0.0.1", "9000"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 30s + + queue: + build: + context: . + target: app + image: oauth-iam-app:latest + restart: unless-stopped + command: php artisan queue:work redis --sleep=3 --tries=3 --max-time=3600 + env_file: .env + volumes: + - app_storage:/var/www/html/storage + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + + scheduler: + build: + context: . + target: app + image: oauth-iam-app:latest + restart: unless-stopped + command: php artisan schedule:work + env_file: .env.production + volumes: + - app_storage:/var/www/html/storage + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + + nginx: + build: + context: . + target: nginx + restart: unless-stopped + ports: + - "80:80" + # - "443:443" + volumes: + - ./docker/nginx/certs:/etc/nginx/certs:ro + depends_on: + - app + + db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${DB_DATABASE} + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + volumes: + - db_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME} -d ${DB_DATABASE}"] + interval: 10s + timeout: 5s + retries: 5 + + redis: + image: redis:7-alpine + restart: unless-stopped + command: redis-server --save 60 1 --appendonly yes + volumes: + - redis_data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + app_storage: + db_data: + redis_data: diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf new file mode 100644 index 0000000..f9542e9 --- /dev/null +++ b/docker/nginx/default.conf @@ -0,0 +1,68 @@ +server { + listen 80; + server_name _; + root /var/www/html/public; + index index.php; + + client_max_body_size 20m; + + # DNS embebido de Docker: resuelve "app" en cada request (en vez de una sola vez + # al arrancar nginx) para no quedarse con una IP vieja si el contenedor "app" se + # recrea (redeploy, restart) mientras nginx sigue corriendo. + resolver 127.0.0.11 valid=10s; + + # Descomentar cuando haya certificados en /etc/nginx/certs (ver docs/despliegue.md) + # y quitar el "location /" de abajo para forzar HTTPS: + # location / { return 301 https://$host$request_uri; } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ \.php$ { + set $php_upstream app:9000; + fastcgi_pass $php_upstream; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name; + include fastcgi_params; + fastcgi_read_timeout 60; + fastcgi_hide_header X-Powered-By; + } + + location ~ /\.(?!well-known) { + deny all; + } + + gzip on; + gzip_types text/css application/javascript application/json image/svg+xml; +} + +# server { +# listen 443 ssl http2; +# server_name tu-dominio.com; +# root /var/www/html/public; +# index index.php; +# +# ssl_certificate /etc/nginx/certs/fullchain.pem; +# ssl_certificate_key /etc/nginx/certs/privkey.pem; +# ssl_protocols TLSv1.2 TLSv1.3; +# +# client_max_body_size 20m; +# resolver 127.0.0.11 valid=10s; +# +# location / { +# try_files $uri $uri/ /index.php?$query_string; +# } +# +# location ~ \.php$ { +# set $php_upstream app:9000; +# fastcgi_pass $php_upstream; +# fastcgi_index index.php; +# fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name; +# include fastcgi_params; +# fastcgi_read_timeout 60; +# } +# } diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh new file mode 100644 index 0000000..efbf6b8 --- /dev/null +++ b/docker/php/entrypoint.sh @@ -0,0 +1,24 @@ +#!/bin/sh +set -e + +cd /var/www/html + +if [ "$CONTAINER_ROLE" = "app" ]; then + chown -R www-data:www-data storage bootstrap/cache + + if [ ! -f storage/oauth-private.key ]; then + echo "Generando claves de Passport (primer arranque)..." + su-exec www-data php artisan passport:keys + fi + + echo "Aplicando migraciones..." + su-exec www-data php artisan migrate --force + + echo "Cacheando configuración, rutas y vistas..." + su-exec www-data php artisan config:cache + su-exec www-data php artisan route:cache + su-exec www-data php artisan view:cache + su-exec www-data php artisan l5-swagger:generate +fi + +exec "$@" diff --git a/docker/php/opcache.ini b/docker/php/opcache.ini new file mode 100644 index 0000000..6c96a0b --- /dev/null +++ b/docker/php/opcache.ini @@ -0,0 +1,7 @@ +opcache.enable = 1 +opcache.enable_cli = 0 +opcache.memory_consumption = 128 +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 20000 +opcache.validate_timestamps = 0 +opcache.save_comments = 1 diff --git a/docker/php/production.ini b/docker/php/production.ini new file mode 100644 index 0000000..02fc48f --- /dev/null +++ b/docker/php/production.ini @@ -0,0 +1,8 @@ +memory_limit = 256M +upload_max_filesize = 20M +post_max_size = 20M +max_execution_time = 60 +expose_php = Off +display_errors = Off +log_errors = On +error_log = /proc/self/fd/2 diff --git a/docs/despliegue.md b/docs/despliegue.md new file mode 100644 index 0000000..62f3817 --- /dev/null +++ b/docs/despliegue.md @@ -0,0 +1,108 @@ +# Despliegue en producción (Docker) + +Stack: `app` (PHP-FPM 8.3) + `nginx` (estáticos y proxy) + `db` (PostgreSQL 16) + `redis` +(cache/sesión/colas) + `queue` (worker) + `scheduler`. + +## 1. Preparar el `.env` + +```bash +cp .env.production.example .env +``` + +Editar `.env` y completar como mínimo: + +- `APP_URL` — dominio real, con `https://`. +- `DB_PASSWORD` — contraseña de PostgreSQL (usada también por el servicio `db`). +- `SESSION_DOMAIN` — dominio (o `.tu-dominio.com` si hay subdominios). +- `APP_KEY` — generar uno nuevo, no reutilizar el de desarrollo: + +```bash +docker run --rm -v "$PWD":/app -w /app composer:2 sh -c \ + "php -r \"echo 'base64:'.base64_encode(random_bytes(32)).PHP_EOL;\"" +``` + +Pegar el resultado en `APP_KEY=`. + +## 2. Levantar el stack + +```bash +docker compose -f docker-compose.prod.yml up -d --build +``` + +En el primer arranque, el contenedor `app` (ver `docker/php/entrypoint.sh`): + +1. Genera las claves RSA de Passport (`storage/oauth-private.key` / `.pub`) si no existen — + quedan persistidas en el volumen `app_storage`, **no se regeneran en cada deploy** (regenerarlas + invalidaría todos los tokens ya emitidos). +2. Corre `php artisan migrate --force`. +3. Cachea config/rutas/vistas y regenera la documentación de Swagger. + +```bash +docker compose -f docker-compose.prod.yml logs -f app +``` + +## 3. Crear el primer usuario admin + +**Recomendado para producción:** no correr `db:seed` (ese seeder crea datos de demo con +contraseñas conocidas). En su lugar, con la base de usuarios vacía, andá a `/register` y creá una +cuenta — al ser la primera, el sistema la marca automáticamente como **admin**, aprobada y con la +sesión iniciada (no hace falta que nadie la apruebe, porque todavía no existe ningún admin). Cualquier +registro posterior vuelve a requerir aprobación manual desde el panel de usuarios. + +Alternativa solo para entornos de prueba/demo, con datos de ejemplo (usuarios, clientes OAuth, historial +de logins falso): + +```bash +docker compose -f docker-compose.prod.yml exec app php artisan db:seed --force +``` + +Esto sí crea `admin@example.com` / `password` — **cambiar la contraseña de inmediato** si se usa +fuera de un entorno descartable. + +## 4. TLS + +Por defecto `nginx` sirve solo HTTP en el puerto 80 (`docker/nginx/default.conf`). Para HTTPS: + +1. Conseguir certificado (por ejemplo con `certbot --webroot` apuntando a + `docker/nginx/certs`, o cualquier CA propia). +2. Colocar `fullchain.pem` y `privkey.pem` en `docker/nginx/certs/`. +3. Descomentar el bloque `server { listen 443 ... }` en `docker/nginx/default.conf` y el + `location /` que redirige a HTTPS. +4. Descomentar `"443:443"` en `docker-compose.prod.yml` (servicio `nginx`). +5. `docker compose -f docker-compose.prod.yml up -d --build nginx`. + +## 5. Desplegar una actualización + +```bash +git pull # o el mecanismo que uses para traer código nuevo +docker compose -f docker-compose.prod.yml up -d --build +``` + +Las claves de Passport, la base de datos y Redis viven en volúmenes con nombre +(`app_storage`, `db_data`, `redis_data`) — sobreviven a los rebuilds. El código y los assets del +frontend, en cambio, se hornean dentro de la imagen en cada build (no hay bind mounts de código en +producción). + +## 6. Backups + +Mínimo indispensable a respaldar: + +- Volumen `db_data` (o mejor, `pg_dump` periódico contra el servicio `db`). +- Volumen `app_storage` — contiene, entre otras cosas, las claves de Passport. Perderlas invalida + todos los tokens emitidos hasta ese momento. + +```bash +docker compose -f docker-compose.prod.yml exec db \ + pg_dump -U "$DB_USERNAME" "$DB_DATABASE" > backup-$(date +%F).sql +``` + +## Servicios del compose + +| Servicio | Rol | +|-------------|-----| +| `app` | PHP-FPM. Corre migraciones y cacheo al arrancar (`CONTAINER_ROLE=app`). | +| `queue` | `php artisan queue:work redis` — misma imagen que `app`, sin el paso de migración. | +| `scheduler` | `php artisan schedule:work` — reemplaza al cron del sistema. | +| `nginx` | Sirve `public/build` y hace proxy de `*.php` a `app:9000`. | +| `db` | PostgreSQL 16, datos en el volumen `db_data`. | +| `redis` | Cache, sesiones y colas, datos en el volumen `redis_data` (AOF activado). | diff --git a/docs/integracion-iam.html b/docs/integracion-iam.html new file mode 100644 index 0000000..f06dc13 --- /dev/null +++ b/docs/integracion-iam.html @@ -0,0 +1,602 @@ + + + + +Integrar tu app con este servidor de identidad (IAM) + + + + +
+ Guía para desarrolladores +

Integrar tu app con este servidor de identidad

+

Cómo conectar Angular, NestJS, Flutter (o cualquier otro stack) a este servidor OAuth2 + para usarlo como IAM centralizado: login, usuarios, roles globales y roles por-app.

+
+ Laravel 12 · Passport 13 (OAuth2, tokens JWT firmados RS256)
+ Generado el 25 de julio de 2026 +
+
+ +
+

Índice

+
    +
  • 1.Qué te da este servidor
  • +
  • 2.Paso 1 — Registrar tu app como cliente OAuth
  • +
  • 3.Elegí el flujo según tu arquitectura
  • +
  • 4.Angular (SPA) — Authorization Code + PKCE
  • +
  • 5.NestJS — backend con login de usuarios
  • +
  • 6.NestJS — servicio backend-a-backend (Client Credentials)
  • +
  • 7.Flutter / apps móviles
  • +
  • 8.Validar el token en tu backend
  • +
  • 9.Roles: global vs. por-app
  • +
  • 10.Refrescar y revocar tokens
  • +
  • 11.Checklist de seguridad
  • +
  • 12.Referencia rápida
  • +
+
+ +
+

1. Qué te da este servidor

+

+Es un servidor de identidad OAuth2 (Laravel Passport). En vez de que cada app tuya tenga su +propia tabla de usuarios y su propio login, todas hablan con este servidor: acá vive el usuario, la +contraseña, y quién es qué. +

+
    +
  • Login centralizado — un solo lugar donde el usuario pone su contraseña. Tu app nunca + la ve: recibe un access token después de que el usuario aprueba el acceso.
  • +
  • Datos de usuario vía API — GET /api/user con el token te devuelve nombre, + email, y sus roles.
  • +
  • Roles globales y roles por-app — un usuario puede ser admin en el sistema + en general, pero además tener un rol específico de tu app (por ejemplo editor en la + tuya y nada en la de otro equipo). Ver sección 9.
  • +
  • Gestión completa por API — si querés armar tu propio panel de administración de + usuarios (en vez de usar el que trae este servidor), toda la funcionalidad está expuesta en + /api/* con Bearer token. No hace falta sesión ni cookies de este servidor.
  • +
+
+ Dos capas de permisos, no confundirlas: los scopes del token OAuth ( + users:read, users:write...) definen qué puede hacer ese token contra la + API de este servidor. Los roles por-app definen qué puede hacer ese usuario dentro de tu app + — son datos que vos leés e interpretás como quieras, este servidor no te impone nada sobre cómo usarlos. +
+
+ +
+

2. Paso 1 — Registrar tu app como cliente OAuth

+

Cada aplicación que se conecte necesita ser un cliente registrado. Se hace una sola vez, desde el +panel (/clients, con cualquier cuenta) o por API:

+
curl -X POST http://localhost:8000/api/clients \
+  -H "Authorization: Bearer {tu_access_token}" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "name": "Mi App Angular",
+    "grant_type": "authorization_code",
+    "redirect_uris": ["https://mi-app.com/callback"],
+    "confidential": false
+  }'
+

La respuesta trae client.id (el client_id) y, si es confidencial, +plain_secret — se muestra una sola vez, guardalo ya.

+ + + + + +
CampoQué significa
grant_typeauthorization_code, client_credentials o password — ver sección 3 para elegir.
redirect_urisA dónde te devuelve el navegador después del login. Tiene que matchear exacto con lo que mandes en /oauth/authorize.
confidentialfalse = cliente público, sin secret (SPA, apps móviles — usan PKCE en su lugar). true = confidencial, con secret (backends que pueden guardar un secreto de forma segura).
+
+ +
+

3. Elegí el flujo según tu arquitectura

+
+
+

SPA pura (Angular, React, Vue)

+

Sin backend propio, corre 100% en el navegador. Authorization Code + PKCE, cliente + público. El token queda en el navegador.

+
+
+

App con backend (NestJS, Express)

+

El backend maneja el login por vos (patrón BFF). Authorization Code, cliente + confidencial — el secret vive en el backend, nunca llega al navegador.

+
+
+

App móvil (Flutter, RN)

+

Authorization Code + PKCE, cliente público, con un redirect por deep link / custom + scheme.

+
+
+

Servicio sin usuario final

+

Un cron, un worker, otro backend que llama a la API por su cuenta. Client Credentials.

+
+
+
+ Password Grant existe pero evitalo salvo que sea estrictamente first-party (una app que vos + mismo controlás de punta a punta): tu app le pide el usuario y contraseña directamente al usuario y se los + manda a este servidor. Ningún cliente de terceros debería tocar la contraseña del usuario. +
+
+ +
+

4. Angular (SPA) — Authorization Code + PKCE

+

Ejemplo con angular-oauth2-oidc (también podés implementarlo a mano, son cuatro pasos: generar +verifier/challenge, redirigir, recibir el code, canjearlo).

+ +app.config.ts +
import { provideOAuthClient, OAuthModule } from 'angular-oauth2-oidc';
+
+export const authConfig = {
+  issuer: 'http://localhost:8000',
+  loginUrl: 'http://localhost:8000/oauth/authorize',
+  tokenEndpoint: 'http://localhost:8000/oauth/token',
+  redirectUri: window.location.origin + '/callback',
+  clientId: '{tu_client_id}',
+  responseType: 'code',
+  scope: 'users:read account:read',
+  useHttpBasicAuth: false,
+  disablePKCE: false, // clave: PKCE prendido, es cliente público
+  oidc: false, // este servidor es OAuth2 puro, no expone id_token/OIDC
+};
+ +auth.service.ts +
import { Injectable } from '@angular/core';
+import { OAuthService } from 'angular-oauth2-oidc';
+
+@Injectable({ providedIn: 'root' })
+export class AuthService {
+  constructor(private oauth: OAuthService) {}
+
+  login() {
+    this.oauth.initCodeFlow(); // redirige a /oauth/authorize con PKCE
+  }
+
+  async me() {
+    const token = this.oauth.getAccessToken();
+    const res = await fetch('http://localhost:8000/api/user', {
+      headers: { Authorization: `Bearer ${token}` },
+    });
+    return res.json(); // { id, name, email, roles, app_roles, ... }
+  }
+}
+

Si preferís no traer una librería, el flujo manual es: generar code_verifier (random) y +code_challenge (SHA-256 + base64url del verifier), armar la URL de +/oauth/authorize con esos parámetros + state, y en el callback hacer +POST /oauth/token con grant_type=authorization_code, el code recibido y +el code_verifier original.

+
+ +
+

5. NestJS — backend con login de usuarios

+

Tu backend actúa de cliente confidencial (guarda el secret) y maneja el flujo Authorization +Code por el usuario — patrón "backend for frontend": el navegador nunca ve el access token, solo una cookie de +sesión propia de tu app.

+ +auth.controller.ts +
@Controller('auth')
+export class AuthController {
+  private readonly IAM = 'http://localhost:8000';
+  private readonly CLIENT_ID = process.env.IAM_CLIENT_ID;
+  private readonly CLIENT_SECRET = process.env.IAM_CLIENT_SECRET;
+
+  @Get('login')
+  login(@Res() res: Response) {
+    const params = new URLSearchParams({
+      client_id: this.CLIENT_ID,
+      redirect_uri: 'https://mi-backend.com/auth/callback',
+      response_type: 'code',
+      scope: 'users:read',
+      state: crypto.randomUUID(),
+    });
+    res.redirect(`${this.IAM}/oauth/authorize?${params}`);
+  }
+
+  @Get('callback')
+  async callback(@Query('code') code: string, @Session() session: Record) {
+    const { data } = await axios.post(`${this.IAM}/oauth/token`, {
+      grant_type: 'authorization_code',
+      client_id: this.CLIENT_ID,
+      client_secret: this.CLIENT_SECRET,
+      code,
+      redirect_uri: 'https://mi-backend.com/auth/callback',
+    });
+
+    session.accessToken = data.access_token; // guardalo del lado del servidor
+    session.refreshToken = data.refresh_token;
+  }
+}
+

Como es cliente confidencial, no hace falta PKCE (aunque no molesta agregarlo igual). El token queda +guardado en la sesión del backend, nunca expuesto al navegador.

+
+ +
+

6. NestJS — servicio backend-a-backend (Client Credentials)

+

Para un servicio que consulta/gestiona usuarios por su cuenta, sin un usuario logueado de por medio — +scheduler, worker, integración entre sistemas.

+ +iam-client.service.ts +
@Injectable()
+export class IamClientService {
+  private token: string | null = null;
+  private expiresAt = 0;
+
+  private async getToken(): Promise {
+    if (this.token && Date.now() < this.expiresAt) return this.token;
+
+    const { data } = await axios.post('http://localhost:8000/oauth/token', {
+      grant_type: 'client_credentials',
+      client_id: process.env.IAM_SERVICE_CLIENT_ID,
+      client_secret: process.env.IAM_SERVICE_CLIENT_SECRET,
+      scope: 'users:read users:write',
+    });
+
+    this.token = data.access_token;
+    this.expiresAt = Date.now() + (data.expires_in - 60) * 1000; // renovar 1 min antes
+    return this.token;
+  }
+
+  async listUsers() {
+    const token = await this.getToken();
+    const { data } = await axios.get('http://localhost:8000/api/users', {
+      headers: { Authorization: `Bearer ${token}` },
+    });
+    return data;
+  }
+}
+
+ Un token de client_credentials no tiene usuario asociado: actúa como "servicio de confianza". + En este servidor eso significa que puede usar /api/users y /api/apps con el + scope como único chequeo (sin necesitar un permiso de usuario admin) — pero no puede tocar + recursos "de cuenta propia" (/api/clients, personal access tokens, apps autorizadas), porque + esos son inherentemente de un usuario y no tiene ninguno asociado. +
+
+ +
+

7. Flutter / apps móviles

+

Con el paquete flutter_appauth (implementa Authorization Code + PKCE con el navegador del +sistema, que es lo recomendado — evita usar un WebView embebido).

+ +auth_service.dart +
final appAuth = FlutterAppAuth();
+
+Future<String?> login() async {
+  final result = await appAuth.authorizeAndExchangeCode(
+    AuthorizationTokenRequest(
+      '{tu_client_id}',
+      'com.miapp://callback', // custom scheme registrado en tu app
+      serviceConfiguration: const AuthorizationServiceConfiguration(
+        authorizationEndpoint: 'http://localhost:8000/oauth/authorize',
+        tokenEndpoint: 'http://localhost:8000/oauth/token',
+      ),
+      scopes: ['users:read'],
+    ),
+  );
+
+  return result.accessToken;
+}
+
+Future<Map<String, dynamic>> me(String token) async {
+  final res = await http.get(
+    Uri.parse('http://localhost:8000/api/user'),
+    headers: {'Authorization': 'Bearer $token'},
+  );
+  return jsonDecode(res.body);
+}
+

El redirect_uri (com.miapp://callback) tiene que estar registrado exactamente +igual en el cliente OAuth (sección 2) y configurado en tu app nativa (Android: intent filter; iOS: URL scheme +en el Info.plist).

+
+ +
+

8. Validar el token en tu backend

+

Cuando tu backend recibe un request con Authorization: Bearer {token} y necesita confirmar que +es válido, hay dos caminos:

+ +

Opción A — Preguntarle a este servidor (más simple)

+
GET /api/user
+Authorization: Bearer {token}
+

Si responde 200 con los datos del usuario, el token es válido. Es un request de red extra por +cada llamada, pero es siempre exacto: refleja revocaciones al instante.

+ +

Opción B — Validar el JWT localmente (sin red)

+

Los access tokens de este servidor son JWT firmados con RS256 (no opacos). Tu backend puede +verificar la firma con la clave pública de Passport (storage/oauth-public.key en este proyecto — +pedísela al equipo que administra este servidor) sin llamarlo por red:

+
// Node.js, con la librería "jsonwebtoken"
+import jwt from 'jsonwebtoken';
+import fs from 'fs';
+
+const publicKey = fs.readFileSync('oauth-public.key');
+
+function verify(token: string) {
+  return jwt.verify(token, publicKey, { algorithms: ['RS256'] });
+  // -> { aud, jti, iat, nbf, exp, sub, scopes: string[] }
+}
+

Claims relevantes: sub = id del usuario (ausente en tokens de client_credentials), +aud = client_id que lo pidió, scopes = array de scopes otorgados, +exp = expiración (unix timestamp).

+
+ Trade-off: la validación local es más rápida (sin red) pero no se entera si el token fue + revocado antes de su expiración natural — solo valida firma y expiración. Para casos sensibles + (borrar acceso ya mismo), usá la Opción A o combiná: validación local + chequeo periódico contra el + servidor. +
+
+ +
+

9. Roles: global vs. por-app

+

GET /api/user (o /api/users/{id}) devuelve, entre otros campos:

+
{
+  "id": 2,
+  "name": "Carla Gómez",
+  "email": "carla@example.com",
+  "roles": ["user"],
+  "app_roles": ["editor"]
+}
+
    +
  • roles — el rol global del usuario en este servidor (admin o + user). No dice nada sobre qué puede hacer en tu app.
  • +
  • app_roles — los roles que un admin le asignó a ese usuario específicamente para el + cliente OAuth que hizo la request (o sea: tu app). Se resuelve solo, según el client_id + del token usado — no hace falta pedir nada extra.
  • +
+

Un admin asigna estos roles desde /admin/users → editar usuario → "Roles por app", eligiendo tu +app de la lista. Interpretalos como quieras del lado tuyo (un guard de NestJS, un route guard de Angular, etc.) +— este servidor solo los guarda y te los devuelve.

+nestjs guard (ejemplo) +
@Injectable()
+export class AppRoleGuard implements CanActivate {
+  async canActivate(context: ExecutionContext): Promise<boolean> {
+    const req = context.switchToHttp().getRequest();
+    const user = await this.iam.me(req.headers.authorization);
+    return user.app_roles.includes('editor');
+  }
+}
+
+ +
+

10. Refrescar y revocar tokens

+

Los access tokens expiran (15 días por defecto en este servidor). Si tu cliente pidió el scope +refresh_token implícito del grant (viene incluido en authorization_code y +password), la respuesta de /oauth/token trae un refresh_token — usalo +así, sin volver a pasar por el login:

+
curl -X POST http://localhost:8000/oauth/token \
+  -d grant_type=refresh_token \
+  -d refresh_token={tu_refresh_token} \
+  -d client_id={tu_client_id} \
+  -d client_secret={tu_client_secret}   # si tu cliente es confidencial
+

client_credentials no tiene refresh token — simplemente pedís uno nuevo cuando el anterior +expira (ver el ejemplo de NestJS en la sección 6).

+

El usuario puede revocarte el acceso en cualquier momento desde /authorized-apps en el panel de +este servidor — a partir de ahí tus requests con ese token empiezan a devolver 401.

+
+ +
+

11. Checklist de seguridad

+
    +
  • ☐ Clientes públicos (SPA, móvil) — siempre PKCE, nunca les asignes un secret que + tendrían que embeber en código que corre en el dispositivo del usuario.
  • +
  • ☐ Pedí solo los scopes que realmente necesitás — no hay scope por defecto en este + servidor, es intencional.
  • +
  • ☐ En una SPA, si podés, no guardes el access token en localStorage (vulnerable a XSS) — + preferí el patrón backend-for-frontend (sección 5) con cookie httpOnly.
  • +
  • ☐ Verificá siempre el parámetro state en el callback de Authorization Code (protección + CSRF del flujo).
  • +
  • ☐ Los client_secret de clientes confidenciales van en variables de entorno del backend, + nunca en el repo ni en el bundle del frontend.
  • +
  • ☐ Si tu servicio backend-a-backend solo necesita leer, pedile a un admin que te dé un cliente con scope + users:read nada más (no users:write).
  • +
+
+ +
+

12. Referencia rápida

+ + + + + + + + + +
EndpointPara qué
GET /oauth/authorizeInicio del flujo Authorization Code (redirige al login/consentimiento).
POST /oauth/tokenCanjear código, credenciales o refresh token por un access token.
GET /api/userWhoami — usuario del token actual + roles global y por-app.
GET/POST/PUT/DELETE /api/usersDirectorio de usuarios (scope users:read/write).
GET/POST/DELETE /api/users/{id}/app-rolesRoles por-app de un usuario (para asignarlos vos mismo por API, si tenés permiso).
GET /api/appsListado de apps (clientes OAuth) registradas.
GET/POST/PUT/DELETE /api/clientsGestionar tus propios clientes OAuth por API.
+ + + + + + +
ScopeDa acceso a
users:readLeer usuarios y sus roles (global + por-app).
users:writeCrear/editar/borrar usuarios, asignar roles por-app.
account:readLeer tus propios clientes OAuth, tokens y apps autorizadas.
account:writeGestionar tus propios clientes OAuth, tokens y apps autorizadas.
+

Documentación interactiva (Swagger, para probar todo esto desde el navegador) en +/api/documentation. Manual completo del panel de administración en +docs/manual-usuario.pdf.

+ +
Guía de integración IAM — generada automáticamente a partir del estado actual del proyecto.
+
+ + + diff --git a/docs/integracion-iam.pdf b/docs/integracion-iam.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ff09257fed5f88a49a8e88241bd242ffffaf9ee GIT binary patch literal 351905 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

V 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

~z!x>3uaZ0TN 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ðQ*WSk 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

    fzqtr4lIaWztEFTcEV;E`y# z>7e6_o-|+etV!=W#pC8U~ALhApZ0hMlEi>ws+O})oxty{EQQQ9YYp)Fz z20wfIWbwceWmmkD(ea_TKHfbf%CADUHYGfMv{CC1pHI%^++UJ%^x*xF6y1GW<2O&` zWjN*(`&vrcU9Cxx6o=Jri`?wtu!m7jkP>QJ>> zrDE+qUTY7X;a06`8PEGW-)Qt!t$>P0y}musW6!m?-FqXG3VLKd-9LA8ufF-sO5gi! zLjRNNJAUeOBh_cPTe}GP^Ebk_&0aF|m9f(gUYUGu=*Zj2m$si-@pk&0Rh6FQ_RV&y z)^KKTrI6ck4-x!FZki+q*EW>zmoY3?m(5u<=ZRXP z>oT`$?lZ&2%-K5Iv+|*sr4c}Mi(VU4JYUeM0UNZHuR;$>qn0xKJ^%}o^-N75# zC+iiDui+o8K05fp8}HT0pIbOh$+1IL9#cGbPb}%#RGs};>$j-ut7qMl9=>SSDLHv^ zlj#%FTZN50u3YgR7?Zxze^tj1%ikE9vLmz3qk^V#)Uk3yn=V-UWv!r3cE`PXd-sc4 zS$mo{ZxZmD9>2*wvC^fDue6@=$sBwCnT$$tZu~|2p%$pPU z?56}hxyhKw#PQYdesyNWibiYv+6)LEzCnAC<}>orRDZc$m#DX6fB)%Bhp0_+UUaIS z+-;Os_b)yP_J7ztw}0Cb51+m9(VZUi=RFN9-ZbpfjgxLq^%%V*=R&uY$45r=o)qxM z<>o$51B&-9?vwahomr1Zq}835SoVg`H1z6zdihJA$cQp0&yGKMNXyw=@A^)+>K`Qgo#_95uh9NR zp^8rq;(2K7Q!f0kol!>K3-`y7_$j;|j@I@iaJz+Ur!W5de^XNmUy`=}#ePc~A1qV= zL2-p5{q@GQ-PV3K8YLfC0D9YhvxjwcrCd{tqM7X?iT3|33!%uumGb>VCppSAx%hje&Wn_wJwCc2+F)z=KZamwgq}+zVEHl+ zHnjWfQC$6RYxK^|T@bsVN$`QT9o{SD-up^uY>#K9>OA~;_1yHO@i(tWjT~PwZH-%{ zM6Y{lpLrV=^q6q_amkw3mOPwzwfzaTxLf^~>q3?Ae0pW;;)gBok2ZFg>38b$ z-TvXjCUmTUOzez=R?}wH4VMxF674^w@FyT*Yvh&Ht%CN{)lMIZTQ@bNVZY*sn^)Vr zV?TnH+qV7Ceeatg?@t}GY;mt2+D_h8Zc@M3`^5O(8L{#B$j{Dif2(=9QG=QWzpPWx zYwN5!r9T_hHwJ0<-`z9wSDj*>){0#5FUkpjQ#2*6TywzxIdkRW(}v(#r>7rA$A1{( z>F_g5(-Y+_fByV*O~X6cF@Ar;K#qm~<~Q_Dn1xI-sw?c@-!O+m!2=6UFbN~cAp4^2 zB*UTOxdZ`bnid$tsh#DJY?Kv+;qQuFC*%aPbPKPzJHs5Zt_f>#Sg2kClNIeNJ0#V9 z4Z|6xL$(PpNi$WUuLE<4?J$QT344=e!@?sF&T}Y+q6m1ARoO(Q*twmC#JjK$Sy$|r zCY;+DGD^8bn4v2ot|UcMgmzdnD#L`nCJF(BIUGo5;-Pz|dC}LB#5wRvy*LLzC_8ZO ztKfJYC~&ZUf61+>Fx0mJgU;=s8XPo-DVufzyy$r7tBAayD4Ip*W}1d2-~fGf z5iful;&^~rl5oC~?$8wh_YfK;j1+NwmMAwQha^#7hvX1x9PLnFDUK&e_-ceOhoo9G zucU}Pi1Ad^6AFD*Qv$37Uobj+Am}_&ui*Do?V94Y{~ov^}&5DrXdX*7U$3)7712p zzB}(tlUO$4`X-Hs;~;seyTG4@$9HI6vQ@BMP1Fm3;X~-u*W~lnT+ld_3a?MM7zTkQ z&Y`2Uk71&{Awd-5Yc~RI=o<4NzG*`H&`};J_66w@-9uGyUkl&m5$8q8q6jk}u?PkM z$S{_jhRpH+;*`fz@UED!7DHuSW?;kAPGed#43@=EZ?s>-V%(dOXq!n6)4}{eeFtAv7O9v z1NRtceU_&3c&biv&0-tGHjH^ZgXJ!^A@U3i9p)L!BAzKUh=jdCDI=)hyk97J(Z`XX zXhfS8!~(OL`W9a3aKbYfon)8X)Umu2rnAzc*JB# zFW78Oa!5x6LENv7Xa>O)(!U5`@!oWm_onN-H_IeD0+N{d10fzdBSYo$FcdLv0qJMT z#2*HXR&j5JPX4cim^HV9u|j>Jd>BSPEFL(upQv=!6(+77609%?F0@0rJh$U{O&8~Z zcn;B!N%1;}VzzeyBfC>F5fBsCVj(&r!Vt2gd0|Hou3*0qP7x!c@enR?F&_C=5<*5q z&lYZJitDo|&Sgg}NJq&aE3q$B6w?*RK->o?m+U44Rf)G`hfMMc?Z}pgCrNTrb}&85 z4z@e77P32K+_@3YL$)I;0gjT)_sR@jx6RpUbdcM4pjhgYbB4pUQ}Q6aB#k z;qfS5EXlB6Xm2tuTZwo^u#|8mQ{F&A7@guxvWy_DIG!Sr9f9pq90_-R$p*ohGk<^# zM0o%!g5)1yBzNt^0qsrUcqhz6vI%9F7PL1U2aN}IqqBr~aRGC&K9ypszzWj_OdlT4 z1^*(fN9|ze(3Lyyl^0==~a$H8RncJx(JJF7DibNRiqcD-|EF(15 zGhh$i8{8SQ-pVE zEf&X`5%pnxgg5<(7jP|^VeF^i8{urLSQg7u%OrVfCptyk!_y@m1dM16cZZ1%6o*W< z3Q`l~_rUEYp9JklW<%wXkAu70WK%0pA0p2n>r8S@LGVkI2WUt3i-JI*$iGO%Fb-f& zif4{?lxKoUcF|5F-GkRWD4z$_O|nFhPzxpSn_@c$1T%;)k=P|40-+3EpKZvB3Gp)Izo`&_ebV+L0ZL^cLe;;n)L0JS3Zdd(yx7 z%mvv>ya#mCrLRzz$i|wXePxwK|(I@hpH!WeLCmM@B#+Q1H_vMSIC#q zeo=Ble5oV&Mf0+4p}^+iz93%ei;572@fq2#J&EmLdlRi02%1wnNJ@gakcnVR#(@iY zih>ow0jkz$Uem?7fdvUKCi^&Wt;p|&%fx2{6;Eq6*^kFbGX4-!p!2{s7=~bkA-${VPNL5XLM2hqqzQXL$-h7=;(2W~RSad`10i!leu5?E#=OYF3Ph-cMd5ih9t zew1kQ14g`n3I{rKRdcaER7Z*Dfodeu3o86+k>3y&AUi^pbn*wG-5AdZw2JZo?Wm?m zl{gm&RmdJa;_(nFpm{;!4C5G-ot~jHLWu~^%W@YX8L}f()F+Da6p;dwyQnH4 zd4+Z)vsDsVkXbu=ov=0~@L?U4|#kl!#N5_K?kw z2pO*rF(~oeG$dH*%wek#o;4I-ig*U=6HXDfpmWm--(qx%K>-D%7gQH@L4c8LS9OGG z#kC->M)M-CMrULw6c<3)k>!=nHk_)%7!c<*5J@K(kSfBEw<262EhL^Lj-2Vh;F>m6 zF_MiA80mA63&o{CYUC5ctzi9z*To2@mV@a9`7&x}>J+;{Nh-xa?bN$SlPZdOc|3z+ zc&Z6wK*Td*C`21bGtn7AEzrE^N@rvlEORUb8HITf)gvDQQB0CA5HG|>w#y{Wi^>YB zYeD##>RKR8iN+yuNG8HnBN?F~CL`hs98Ee8FtY136@_FX4xrBohESC#6Ez7ZEcUgN zy#!wc z(KBGg3vgjc7Tcu|B0b}N4e>9;J@GGYYmknI#9`WnP^2}x$O}QukbFi)o#Znr-^dn4 znFr}rMAyh3hh!%^0_hL(7a(1jCP8eX-oj-hUNeY@XamS1xP9i)A7r zX(WqLo}OX7LJo2Gay(n2J249IMeKTt(M z{ywA?t=Yh3T#KDaX;nk8(F)glzKuUzxjNwF?2c zKuI~{6fnN~g&Q!UZ-Ah@F75*`ioc))gX)Iu+a#iF0*rEeFwEfD3hP7JgNQ3=4~kRU z8b#E3xOYc!e%ZcaC(u0tk+Nv#0EPlPVJ&uT_b3V?TUkb_nkXXxquL_~Fo4Ci7<4}Xo;cM70cH}df%8TC3W-I^`@v%eP?#5$ zB(z^d(M5d(flcv0U>T7H=kWlexF{5gLzMS`;cL!fUtEe4XcFl>1Rtm!0@WhSpgJB{ zIdn(NPSc700$_@0C)#N`(e^=LnEU`(S1#s7j8R-41eWN7A-#n_wXhG!1JUmRb5M;n zU~~ryN`dmpfYCi>zz~!c=SBQfgxMutBJLq2#rQ6wG%$Yt880EeH@>J4?->#j6geRA z!@@h-K@qXB34Xe*lI>3=v>h4~>xb$5?6-)AC-ja_D7?>Y+rGNuS*upd@K&Dx0pVUI AlK=n! literal 0 HcmV?d00001 diff --git a/docs/manual-usuario.html b/docs/manual-usuario.html new file mode 100644 index 0000000..da437ff --- /dev/null +++ b/docs/manual-usuario.html @@ -0,0 +1,620 @@ + + + + +OAuth2 Server — Manual de uso + + + + +
    + Documentación técnica +

    OAuth2 Identity Server

    +

    Manual de uso: puesta en marcha, panel de administración, flujos OAuth2 y API REST completa para construir cualquier cliente propio (Angular, Flutter, NestJS, etc.).

    +
    + Laravel 12 · Passport 13 · Vue 3 + TypeScript · SCSS/BEM · spatie/laravel-permission · L5-Swagger
    + Generado el 25 de julio de 2026 +
    +
    + +
    +

    Índice

    +
      +
    • 1.Qué es esta app
    • +
    • 2.Puesta en marcha
    • +
    • 3.Usuarios por defecto (seed)
    • +
    • 4.Uso de la interfaz web (panel de administración)
    • +
    • 5.Analíticas: sesiones, logins y actividad
    • +
    • 6.Roles, permisos y roles por app
    • +
    • 7.Idioma (español / inglés / catalán)
    • +
    • 8.Cómo conectar tu app (Angular, NestJS, Flutter, etc.)
    • +
    • 9.API REST completa: construí tu propio panel admin
    • +
    • 10.Documentación interactiva (Swagger)
    • +
    • 11.Referencia rápida de rutas
    • +
    +
    + +
    +

    1. Qué es esta app

    +

    +Es un servidor de identidad / OAuth2 (Laravel Passport) pensado para ser el centro único de +usuarios, autenticación y permisos de un conjunto de aplicaciones propias. No es una app de negocio con datos +propios: su único "recurso" son los usuarios y sus roles. +

    +

    Provee tres piezas:

    +
      +
    • Servidor de autorización OAuth2 — login, pantalla de consentimiento, y emisión de tokens + con los cuatro flujos estándar: Authorization Code + PKCE, Client Credentials, Password Grant y Personal + Access Tokens.
    • +
    • Panel de administración en Vue 3 + TypeScript — la UI que trae la app "de fábrica", + servida por el propio Laravel, autenticada por sesión. Estilos en SCSS con nomenclatura BEM + (resources/scss/), sin frameworks de utility-classes.
    • +
    • API REST completa (/api/*) — el mismo conjunto de funciones del + panel Vue (usuarios, roles por app, clientes OAuth, personal access tokens, apps autorizadas), pero + autenticada 100% por token OAuth2 (sin sesión ni cookies). Con esto se puede construir otro admin + entero en Angular, Flutter, o cualquier otro cliente — no hace falta usar la SPA Vue.
    • +
    +
    + Idea central: cada aplicación externa que quiera loguear usuarios se registra acá como un + cliente OAuth ("app"). Un mismo usuario puede tener un rol global (admin/user) y, además, un rol + distinto dentro de cada app (por ejemplo: admin en la app de Angular, usuario normal en la de NestJS). +
    +
    + Dos frentes, misma API subyacente: la SPA Vue (sesión + cookies, pensada para uso interno + en el navegador de este mismo servidor) y la API REST (Bearer token, pensada para cualquier cliente externo) + exponen las mismas capacidades. Elegí el que corresponda: sesión para la UI que ya viene incluida, + token para construir la tuya propia. +
    +
    + +
    +

    2. Puesta en marcha

    +

    Requisitos

    +
      +
    • PHP 8.4+, Composer
    • +
    • Node.js + npm
    • +
    • SQLite (por defecto, cero configuración — se puede cambiar en .env)
    • +
    +

    Instalación (primera vez)

    +
    composer install
    +npm install
    +php artisan migrate --seed
    +npm run build
    +
    + Frontend: TypeScript (npm run type-check corre vue-tsc sin + emitir archivos) y SCSS compilado por Vite (paquete sass) desde + resources/scss/app.scss — no hay ningún framework de CSS utility-first instalado. +
    +

    Levantar todo en desarrollo

    +
    composer run dev
    +

    Este comando levanta en paralelo: el servidor PHP (php artisan serve), Vite en modo watch, la +cola de trabajos y los logs. La app queda disponible en http://localhost:8000.

    +
    + Reiniciar todo de cero: php artisan migrate:fresh --seed borra la base y + vuelve a crear los usuarios/clientes de ejemplo descriptos en la sección 3. Los client_secret + de los clientes OAuth de ejemplo se imprimen en la consola en ese momento — solo se muestran una vez. +
    +
    + +
    +

    3. Usuarios por defecto (seed)

    +

    El seeder (database/seeders/DatabaseSeeder.php) crea una cuenta admin y algunos usuarios de +ejemplo para poder probar la app de inmediato:

    +
    +
    +

    🛡 Administrador

    +
    Email: admin@example.com
    +
    Password: password
    +
    Rol global: admin
    +
    Acceso al panel de administración de usuarios.
    +
    +
    +

    👤 Usuario normal

    +
    Email: carla@example.com
    +
    Password: password
    +
    Rol global: user
    +
    Sin acceso al panel admin. Es admin dentro de la app "Demo SPA" (rol por-app de ejemplo). Junto con martin@example.com y bea@example.com, solo están para que la sección de analíticas tenga datos de entrada.
    +
    +
    +
    + El seeder también crea nuevo@example.com / password sin aprobar, para que la + pestaña "Pendientes" del panel de usuarios (sección 4) no arranque vacía. +
    +
    + Instalación sin seed (producción): si nunca corriste db:seed, no hay ningún + usuario en la base. En ese caso, la primera cuenta que se registre por /register + queda automáticamente como admin, aprobada y con la sesión iniciada — no hace falta que + nadie más la apruebe, porque todavía no existe ningún admin que pudiera hacerlo. La pantalla de registro + avisa de esto con un mensaje cuando detecta que la base está vacía. A partir del segundo registro, vuelve + a regir el flujo normal (pendiente de aprobación por un admin). +
    + +

    Clientes OAuth (apps) de ejemplo

    +

    El seeder también registra apps de prueba, una por cada flujo soportado. El client_id es fijo +por ejecución (UUID nuevo cada migrate:fresh); el client_secret solo se muestra por +consola al sembrar — si lo perdiste, hay que crear un cliente nuevo desde el panel (sección 4) o volver a +sembrar.

    + + + + + + + +
    NombreGrant typeUso
    Demo SPA (Authorization Code + PKCE)authorization_codeCliente público (sin secret), para apps tipo SPA/móvil.
    Demo Service (Client Credentials)client_credentialsComunicación máquina-a-máquina, sin usuario.
    Demo First-Party App (Password Grant)passwordApps propias de confianza, login directo usuario/contraseña.
    Swagger UIauthorization_code, client_credentialsPara probar el botón "Authorize" de la documentación interactiva.
    Personal Access Clientpersonal_accessInterno — necesario para poder emitir Personal Access Tokens.
    +
    + +
    +

    4. Uso de la interfaz web (panel de administración)

    +

    Todo se maneja desde http://localhost:8000 (Vue Router, sin recargar página).

    +
    + Modo oscuro: el ícono de sol/luna en la barra de navegación alterna entre claro y oscuro. + La preferencia se guarda en localStorage (por navegador, no por cuenta) y, si nunca la tocaste, + arranca siguiendo el modo del sistema operativo. El cambio se aplica antes del primer render — no hay + parpadeo del tema equivocado al cargar la página. +
    + +

    Login / Registro

    +

    /login y /register. El registro crea la cuenta con rol global user +automáticamente, pero no loguea al usuario: queda pendiente de aprobación. La pantalla muestra +un mensaje de "Cuenta creada" y el login devuelve error hasta que un admin la aprueba desde el panel de +usuarios (sección 4). Excepción: si la base de usuarios está vacía, esa primera cuenta se +crea como admin y queda logueada de una (ver sección 3).

    + +

    Dashboard

    +

    / — accesos rápidos a Clientes OAuth, Personal Access Tokens, Apps autorizadas y (si sos admin) +Usuarios.

    + +

    Clientes OAuth

    +

    /clients — cada usuario ve y gestiona sus propios clientes (apps que registró). Al +crear uno se elige:

    +
      +
    • Authorization Code + PKCE: hay que indicar redirect URIs; opcionalmente "confidencial" + (con secret) o público (solo PKCE, sin secret).
    • +
    • Client Credentials: siempre confidencial, sin redirect URI.
    • +
    • Password Grant: para apps propias de confianza.
    • +
    +
    El client_secret se muestra una sola vez, justo después de +crear el cliente. Copiarlo en ese momento.
    + +

    Personal Access Tokens

    +

    /tokens — tokens tipo "API key" para el propio usuario, sin pasar por el flujo de consentimiento. +Se elige nombre y scopes. El token completo también se muestra una única vez.

    + +

    Apps autorizadas

    +

    /authorized-apps — lista de apps de terceros a las que el usuario le dio acceso a su cuenta vía +/oauth/authorize, con opción de revocar el acceso en cualquier momento.

    + +

    Usuarios (solo admins)

    +

    /admin/users — alta, edición (nombre, email, contraseña, rol global, activo/desactivado) y baja +de cualquier usuario del sistema. Protecciones incluidas: no podés borrarte a vos mismo, no podés quitarte el +rol admin a vos mismo, no se puede borrar al último administrador. Un usuario desactivado no puede iniciar +sesión.

    +
    + Borrado = papelera (soft delete). "Borrar" un usuario no lo elimina de la base: lo oculta + (desaparece de logins, listados y de cualquier chequeo de permisos) pero queda recuperable. El botón + "Ver papelera" arriba a la derecha del listado muestra los usuarios borrados, con dos + acciones por fila: Restaurar (vuelve a aparecer tal cual estaba) o Borrar + definitivamente (ahí sí, sin vuelta atrás). +
    +
    + Registros pendientes de aprobación. Arriba a la derecha del listado hay tres pestañas: + Ver activos, Pendientes (con un contador si hay alguno) y Ver papelera. + Todo el que se registra por /register aparece en "Pendientes" hasta que un admin lo + aprueba (ahí ya puede iniciar sesión) o lo rechaza (va a la papelera, + igual que un borrado normal — se puede restaurar). Un usuario dado de alta directamente por un admin + (el formulario "Nuevo usuario" de esta misma pantalla) queda aprobado automáticamente. +
    + +

    Analíticas (solo admins)

    +

    /admin/analytics — ver sección 5.

    +
    + +
    +

    5. Analíticas: sesiones, logins y actividad

    +

    +Pantalla de monitoreo para el admin: cada vez que Passport emite un access token (cualquier grant type) o alguien +inicia sesión en el panel, queda un registro en login_events. Con eso se arman: +

    +
      +
    • KPIs: usuarios totales, sesiones activas (tokens OAuth vigentes, no revocados ni + expirados), logins de hoy y de los últimos 7 días.
    • +
    • Logins por día (últimos 7/30/90 días, elegible arriba a la derecha): barras apiladas — + logins de apps (OAuth) vs. logins al panel admin (sesión) — con tooltip al pasar el mouse sobre cada día.
    • +
    • Logins por app: qué apps se usan más.
    • +
    • Usuarios más activos: ranking por cantidad de logins en el período.
    • +
    • Actividad reciente: tabla con los últimos eventos (usuario, app, tipo, IP, cuándo).
    • +
    +
    + El seeder de demo genera 30 días de actividad sintética para que estos gráficos no arranquen vacíos. En un + despliegue real, los datos son 100% eventos reales — no hay nada que "activar". +
    +

    Misma info disponible por API: GET /api/analytics/summary?days=30 (scope +users:read, requiere el permiso users.view — igual que el resto del panel admin).

    +
    + +
    +

    6. Roles, permisos y roles por app

    +

    Roles globales

    +

    Gobiernan el panel de administración de esta app (spatie/laravel-permission):

    + + + + +
    RolPermisos
    adminusers.view, users.create, users.update, users.delete
    userNinguno extra — gestiona su propio perfil, sus clientes OAuth y sus tokens.
    + +

    Roles por app

    +

    Independientes del rol global: un admin le puede asignar a cualquier usuario un rol (admin o +user) específico de una app registrada, desde el panel de edición de usuario +("Roles por app"). Sirve para que, por ejemplo, un usuario sea admin dentro de la app Angular +pero solo user dentro de la app NestJS — sin tocar su rol global.

    +

    Esa información viaja en la respuesta de la API (app_roles, ver sección 8): cada app ve +únicamente el rol que ese usuario tiene en ella, resuelto automáticamente según el client_id +del token usado en la request.

    +
    + +
    +

    7. Idioma (español / inglés / catalán)

    +

    El selector está arriba a la derecha en la barra de navegación (ES / EN / CA). Cambiarlo +hace un POST a /web-api/locale, guarda el idioma en la sesión y recarga la página — el servidor +decide el idioma con el que renderiza esa carga (mensajes de validación/autenticación vía +laravel-lang, más los textos propios de la app en lang/{es,en,ca}/messages.php).

    + + + + + +
    IdiomaMensajes del servidorInterfaz (SPA Vue)
    ES (español, por defecto)✓✓
    EN (inglés)✓✓ — traducción completa (nav, botones, formularios, tablas, gráficos)
    CA (catalán)✓✓ — traducción completa
    +

    La interfaz usa vue-i18n con diccionarios en resources/js/i18n/{es,en,ca}.js +(168 claves cada uno). El locale de arranque del frontend se inyecta desde el servidor +(window.__LOCALE__ en app.blade.php), así que la SPA nace ya en el idioma correcto +sin parpadeo.

    +
    + +
    +

    8. Cómo conectar tu app (Angular, NestJS, Flutter, etc.)

    +

    Paso 1 — Registrar la app

    +

    Desde /clients, crear un cliente OAuth eligiendo el grant type según el tipo de app:

    + + + + + +
    Tipo de appGrant recomendado
    SPA (Angular, React) servida al navegadorAuthorization Code + PKCE, cliente público
    Backend con secret propio (NestJS, Express)Authorization Code, cliente confidencial, o Client Credentials si no hay usuario final
    Servicio interno máquina-a-máquinaClient Credentials
    + +

    Paso 2 — Login del usuario (Authorization Code + PKCE, ej. Angular)

    +

    Redirigir el navegador a:

    +
    GET /oauth/authorize
    +    ?client_id={client_id}
    +    &redirect_uri={tu_callback}
    +    &response_type=code
    +    &scope=users:read users:write
    +    &state={valor_random}
    +    &code_challenge={challenge_pkce}
    +    &code_challenge_method=S256
    +

    El usuario loguea (o ya tiene sesión) y aprueba el acceso. Passport redirige a redirect_uri +con ?code=...&state=....

    + +

    Paso 3 — Canjear el código por un token

    +
    curl -X POST http://localhost:8000/oauth/token \
    +  -d grant_type=authorization_code \
    +  -d client_id={client_id} \
    +  -d code={code} \
    +  -d redirect_uri={tu_callback} \
    +  -d code_verifier={verifier_pkce}
    + +

    Alternativa — Client Credentials (ej. NestJS backend-a-backend)

    +
    curl -X POST http://localhost:8000/oauth/token \
    +  -d grant_type=client_credentials \
    +  -d client_id={client_id} \
    +  -d client_secret={client_secret} \
    +  -d scope="users:read"
    +
    Un token de client_credentials no tiene usuario asociado: actúa como +"servicio de confianza" y puede listar/crear/editar usuarios sin más chequeo que el scope del token.
    +
    + +
    +

    9. API REST completa: construí tu propio panel admin

    +

    +Todo lo que hace la SPA Vue por sesión también está disponible por token OAuth2. Esto significa que un cliente +Angular, Flutter, o lo que sea, puede ser un admin completo — no solo consultar usuarios — +sin depender de la sesión de Laravel. Todos los endpoints requieren Authorization: Bearer {access_token}. +

    + +

    Usuarios y roles (scopes users:read / users:write)

    + + + + + + + + + + + + + + + + + + +
    MétodoRutaDescripción
    GET/api/userWhoami: usuario del token actual, con roles y app_roles.
    GET/api/usersListar usuarios (requiere users.view, salvo client_credentials).
    POST/api/usersCrear usuario (requiere users.create).
    GET/api/users/{id}Ver un usuario. Siempre permitido sobre uno mismo.
    PUT/api/users/{id}Editar. Uno mismo puede cambiar nombre/email/contraseña; rol/estado y otros usuarios requieren users.update.
    DELETE/api/users/{id}Borrar — soft delete, va a la papelera (requiere users.delete; no se puede autoeliminar).
    GET/api/users/trashedListar usuarios en la papelera (requiere users.view).
    POST/api/users/{id}/restoreRestaurar un usuario borrado (requiere users.update).
    DELETE/api/users/{id}/forceBorrado definitivo, sin vuelta atrás (requiere users.delete; el usuario tiene que estar en la papelera).
    GET/api/users/pendingListar registros pendientes de aprobación (requiere users.view).
    POST/api/users/{id}/approveAprobar un registro pendiente (requiere users.update).
    GET/api/users/{id}/app-rolesRoles del usuario por app (propio siempre permitido; otros requieren users.view).
    POST/api/users/{id}/app-rolesAsignar un rol en una app (requiere users.update, sin excepción para uno mismo).
    DELETE/api/users/{id}/app-roles/{clientId}/{role}Quitar un rol en una app (requiere users.update).
    GET/api/appsListar todas las apps registradas (requiere users.view) — para armar el selector de roles-por-app.
    GET/api/analytics/summary?days=30KPIs, logins por día/app, usuarios más activos y actividad reciente (requiere users.view).
    + +

    Ejemplo de respuesta de usuario

    +
    {
    +  "id": 2,
    +  "name": "Carla Gómez",
    +  "email": "carla@example.com",
    +  "is_active": true,
    +  "roles": ["user"],
    +  "app_roles": ["admin"],
    +  "created_at": "2026-07-25T08:52:39.000000Z"
    +}
    +

    roles es el rol global; app_roles es el rol de ese usuario específicamente en la +app dueña del token usado para la request (útil para que cada app decida qué mostrar/permitir sin tener su +propio sistema de permisos). El campo deleted_at solo aparece (no-null) en las respuestas de +/api/users/trashed.

    + +

    Cuenta propia: clientes, tokens y apps autorizadas (scopes account:read / account:write)

    +

    Equivalente por token a /web-api/clients, /personal-access-tokens y +/authorized-apps de la sección 4 — siempre sobre el usuario dueño del token (no aplica a +client_credentials, que no tiene usuario asociado):

    + + + + + + + + + + + +
    MétodoRutaDescripción
    GET/api/clientsListar tus clientes OAuth (apps que registraste).
    POST/api/clientsRegistrar un cliente nuevo (devuelve plain_secret una sola vez).
    PUT/api/clients/{id}Editar nombre/redirect URIs.
    DELETE/api/clients/{id}Revocar el cliente y sus tokens.
    GET/api/personal-access-tokensListar tus Personal Access Tokens.
    POST/api/personal-access-tokensCrear uno (el token se muestra una sola vez).
    DELETE/api/personal-access-tokens/{id}Revocarlo.
    GET/api/authorized-appsApps de terceros a las que le diste acceso.
    DELETE/api/authorized-apps/{tokenId}Revocarle el acceso a una.
    + +

    Scopes disponibles

    + + + + + + +
    ScopePermite
    users:readLeer usuarios y roles por app
    users:writeCrear, editar y borrar usuarios; asignar roles por app
    account:readLeer tus clientes OAuth, tokens y apps autorizadas
    account:writeGestionar tus clientes OAuth, tokens y apps autorizadas
    +

    No hay scope por defecto: cada app debe pedir explícitamente los que necesita al iniciar el flujo OAuth +(ej. scope=users:read users:write account:read account:write para un admin completo).

    +
    + Client credentials y recursos self-service: un token client_credentials no + tiene usuario asociado, así que /api/clients, /api/personal-access-tokens y + /api/authorized-apps le devuelven 422 (no hay "cuenta propia" que gestionar). + Sí puede usar /api/users y /api/apps como servicio de confianza. +
    +
    + +
    +

    10. Documentación interactiva (Swagger)

    +

    Disponible en http://localhost:8000/api/documentation. Incluye el botón Authorize +para probar los tres flujos (Authorization Code, Client Credentials, Password) directamente desde el navegador, +usando el cliente de ejemplo "Swagger UI" sembrado (sección 3).

    +

    El JSON crudo de la especificación OpenAPI está en /docs.

    +
    + +
    +

    11. Referencia rápida de rutas

    +

    Interfaz web (sesión, uso interno de esta app)

    + + + + + + + + + + + + + + + + + + +
    RutaQué hace
    POST /web-api/registerRegistro — crea la cuenta pendiente, no loguea.
    POST /web-api/login / /logoutAutenticación por sesión.
    GET /web-api/meUsuario logueado (con roles/permisos).
    GET/POST/PUT/DELETE /web-api/clientsClientes OAuth propios.
    GET/POST/DELETE /web-api/personal-access-tokensPersonal Access Tokens propios.
    GET/DELETE /web-api/authorized-appsApps de terceros autorizadas.
    GET/POST/PUT/DELETE /web-api/admin/usersAdministración de usuarios (admin).
    GET /web-api/admin/users/trashedUsuarios en la papelera (admin).
    POST /web-api/admin/users/{id}/restoreRestaurar un usuario borrado (admin).
    DELETE /web-api/admin/users/{id}/forceBorrado definitivo (admin).
    GET /web-api/admin/users/pendingRegistros pendientes de aprobación (admin).
    POST /web-api/admin/users/{id}/approveAprobar un registro pendiente (admin).
    GET /web-api/admin/appsListado de todas las apps registradas (admin).
    GET/POST/DELETE /web-api/admin/users/{id}/app-rolesRoles por app de un usuario (admin).
    GET /web-api/admin/analytics/summarySesiones, logins y actividad (admin).
    POST /web-api/localeCambiar idioma (es/en/ca).
    + +

    OAuth2 (Passport)

    + + + + +
    RutaQué hace
    GET /oauth/authorizeInicio del flujo Authorization Code (pantalla de consentimiento).
    POST /oauth/tokenEmisión/renovación de tokens (todos los grant types).
    + +

    API REST (Bearer token, para apps externas — Angular, Flutter, lo que sea)

    + + + + + + + + + + + + + + + +
    RutaQué hace
    GET /api/userWhoami.
    GET/POST/PUT/DELETE /api/usersGestión de usuarios (DELETE = papelera).
    GET /api/users/trashedUsuarios en la papelera.
    POST /api/users/{id}/restoreRestaurar un usuario borrado.
    DELETE /api/users/{id}/forceBorrado definitivo.
    GET /api/users/pendingRegistros pendientes de aprobación.
    POST /api/users/{id}/approveAprobar un registro pendiente.
    GET/POST/DELETE /api/users/{id}/app-rolesRoles por app de un usuario.
    GET /api/appsListado de apps registradas.
    GET /api/analytics/summarySesiones, logins y actividad.
    GET/POST/PUT/DELETE /api/clientsTus clientes OAuth.
    GET/POST/DELETE /api/personal-access-tokensTus Personal Access Tokens.
    GET/DELETE /api/authorized-appsApps de terceros que autorizaste.
    + +
    OAuth2 Identity Server — Manual de uso · generado automáticamente a partir del estado actual del proyecto.
    +
    + + + diff --git a/docs/manual-usuario.pdf b/docs/manual-usuario.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f1ed30c6d92de4f828eab7596f8b9280e2167d81 GIT binary patch literal 496612 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%0DVBgZz$5ieVG(}^3^AG_khikT7@vel%R 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℞1`}*pNhpE+-)gEjK#34n_$|J#+@ETPhnW9)4 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%0AyxrMraE~l}t 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%0DnEE-9T~POP)4ac>dZRpq4<+H;V<& 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 Msb0N}XWJtG11E4#KmY&$ literal 0 HcmV?d00001 diff --git a/lang/ca.json b/lang/ca.json new file mode 100644 index 0000000..5eee002 --- /dev/null +++ b/lang/ca.json @@ -0,0 +1,229 @@ +{ + "(and :count more error)": "(i :count error més)", + "(and :count more errors)": "(i :count error més)|(i :count errors més)|(i :count errors més)", + "A decryption key is required.": "Cal una clau de desxifrat.", + "A Timeout Occurred": "S'ha produït un temps mort", + "Accept": "Acceptar", + "Accepted": "Acceptat", + "Action": "Acció", + "Actions": "Accions", + "Add": "Afegir", + "Add :name": "Afegeix :name", + "Admin": "Admin", + "Agree": "Acordar", + "All rights reserved.": "Tots els drets reservats.", + "Already Reported": "Ja s'ha informat", + "Archive": "Arxiu", + "Assign": "Assignar", + "Associate": "Associat", + "Attach": "Adjuntar", + "Bad Gateway": "Porta d'enllaç incorrecta", + "Bad Request": "Petició dolenta", + "Bandwidth Limit Exceeded": "Límit d'ample de banda excedit", + "Browse": "Navega", + "Cancel": "Cancel·la", + "Choose": "Triar", + "Choose :name": "Trieu :name", + "Choose File": "Tria el fitxer", + "Choose Image": "Trieu Imatge", + "Click to copy": "Feu clic per copiar", + "Client Closed Request": "Sol·licitud de client tancada", + "Close": "Tancar", + "Collapse": "Col·lapse", + "Collapse All": "Col · lapsar tot", + "Comment": "Comenta", + "Confirm": "Confirmar", + "Conflict": "Conflicte", + "Connect": "Connecta't", + "Connection Closed Without Response": "Connexió tancada sense resposta", + "Connection Timed Out": "Temps de connexió esgotat", + "Continue": "Continua", + "Create": "Crear", + "Create :name": "Crea :name", + "Created": "Creat", + "Delete": "Esborrar", + "Delete :name": "Suprimeix :name", + "Detach": "Separa", + "Details": "Detalls", + "Disable": "Deshabilitar", + "Discard": "Descartar", + "Done": "Fet", + "Down": "Avall", + "Duplicate": "Duplicat", + "Duplicate :name": "Duplicat: nom", + "Edit": "Edita", + "Edit :name": "Edita :name", + "Enable": "Habilitar", + "Encrypted environment file already exists.": "El fitxer d'entorn xifrat ja existeix.", + "Encrypted environment file not found.": "No s'ha trobat el fitxer d'entorn xifrat.", + "Environment file already exists.": "El fitxer d'entorn ja existeix.", + "Environment file not found.": "No s'ha trobat el fitxer d'entorn.", + "errors": "errors", + "Expand": "Ampliar", + "Expand All": "Amplia-ho tot", + "Expectation Failed": "L'expectativa ha fallat", + "Explanation": "Explicació", + "Export": "Exporta", + "Export :name": "Export :name", + "Failed Dependency": "Dependència fallida", + "File": "Dossier", + "Files": "Fitxers", + "Forbidden": "Prohibit", + "Found": "Trobat", + "Gateway Timeout": "Temps d'espera de la passarel·la", + "Go Home": "Aneu a l'inici", + "Go to page :page": "Aneu a la pàgina :page", + "Gone": "Desaparegut", + "Hello!": "Hola!", + "Hide": "Amaga", + "Hide :name": "Amaga :name", + "Home": "Inici", + "HTTP Version Not Supported": "Versió HTTP no compatible", + "I'm a teapot": "Sóc una tetera", + "If you did not create an account, no further action is required.": "Si no heu creat cap compte, no es requereix cap acció adicional.", + "If you did not request a password reset, no further action is required.": "Si no heu sol·licitat el restabliment de la contrasenya, obvieu aquest correu electrònic.", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si té algun problema per a fer clic al botó \":actionText\", copii i enganxi la següent URL al seu navegador web", + "IM Used": "IM utilitzat", + "Image": "Imatge", + "Impersonate": "Suplantar", + "Impersonation": "Suplantació d'identitat", + "Import": "Importar", + "Import :name": "Importació :name", + "Insufficient Storage": "Emmagatzematge insuficient", + "Internal Server Error": "error del servidor intern", + "Introduction": "Introducció", + "Invalid filename.": "Nom de fitxer no vàlid.", + "Invalid JSON was returned from the route.": "S'ha retornat un JSON no vàlid des de la ruta.", + "Invalid SSL Certificate": "Certificat SSL no vàlid", + "Length Required": "Longitud requerida", + "Like": "M'agrada", + "Load": "Carrega", + "Localize": "Localitza", + "Location": "Ubicació", + "Locked": "Tancat", + "Log In": "Entrar", + "Log Out": "Sortir", + "Login": "Entrar", + "Logout": "Sortir", + "Loop Detected": "Bucle detectat", + "Maintenance Mode": "mode de manteniment", + "Method Not Allowed": "Mètode no permès", + "Misdirected Request": "Sol·licitud mal dirigida", + "Moved Permanently": "Mogut permanentment", + "Multi-Status": "Multiestatus", + "Multiple Choices": "Opcions múltiples", + "Network Authentication Required": "Es requereix autenticació de xarxa", + "Network Connect Timeout Error": "Error de temps d'espera de connexió a la xarxa", + "Network Read Timeout Error": "Error de temps d'espera de lectura de la xarxa", + "New": "Nous", + "New :name": "Nou :name", + "No": "No", + "No Content": "Sense contingut", + "Non-Authoritative Information": "Informació no autoritzada", + "Not Acceptable": "No és acceptable", + "Not Extended": "No ampliat", + "Not Found": "No trobat", + "Not Implemented": "No implementat", + "Not Modified": "No modificat", + "of": "de", + "OK": "D'acord", + "Open": "Obert", + "Open in a current window": "Obre en una finestra actual", + "Open in a new window": "Obre en una finestra nova", + "Open in a parent frame": "Obre en un marc principal", + "Open in the topmost frame": "Obre al marc superior", + "Open on the website": "Obert al lloc web", + "Origin Is Unreachable": "L'origen és inabastable", + "Page Expired": "Pàgina caducada", + "Pagination Navigation": "Navegació de la paginació", + "Partial Content": "Contingut parcial", + "Payload Too Large": "Càrrega útil massa gran", + "Payment Required": "Pagament obligatori", + "Permanent Redirect": "Redirecció permanent", + "Please click the button below to verify your email address.": "Si us plau, feu clic al botó inferior per verificar la vostra adreça electrònica.", + "Precondition Failed": "La condició prèvia ha fallat", + "Precondition Required": "Condició prèvia requerida", + "Preview": "Vista prèvia", + "Price": "Preu", + "Processing": "Processament", + "Proxy Authentication Required": "Es requereix autenticació de proxy", + "Railgun Error": "Error de canó de ferrocarril", + "Range Not Satisfiable": "Interval no satisfactori", + "Record": "Registre", + "Regards,": "Salutacions,", + "Register": "Registre", + "Request Header Fields Too Large": "Els camps de la capçalera de la sol·licitud són massa grans", + "Request Timeout": "Temps d'espera esgotat", + "Reset Content": "Restablir contingut", + "Reset Password": "Restablir contrasenya", + "Reset your password": "Restableix la teva contrasenya", + "Restore": "Restauració", + "Restore :name": "Restaurar :name", + "results": "resultats", + "Retry With": "Torna-ho a provar amb", + "Save": "Desar", + "Save & Close": "Desa i tanca", + "Save & Return": "Guarda i torna", + "Save :name": "Estalvia :name", + "Search": "Cerca", + "Search :name": "Cerca :name", + "See Other": "Vegeu Altres", + "Select": "Seleccioni", + "Select All": "Seleccionar tot", + "Send": "Enviar", + "Server Error": "Error del servidor", + "Service Unavailable": "Servei no disponible", + "Session Has Expired": "La sessió ha caducat", + "Settings": "Configuració", + "Show": "Espectacle", + "Show :name": "Mostra :name", + "Show All": "Mostrar tots", + "Showing": "Mostrant", + "Sign In": "Inicieu la sessió", + "Solve": "Resol", + "SSL Handshake Failed": "SSL Handshake ha fallat", + "Start": "Començar", + "Stop": "Atura", + "Submit": "Presentar", + "Subscribe": "Subscrigui", + "Switch": "Interruptor", + "Switch To Role": "Canvia al rol", + "Switching Protocols": "Protocols de commutació", + "Tag": "Etiqueta", + "Tags": "Etiquetes", + "Temporary Redirect": "Redirecció temporal", + "The given data was invalid.": "Les dades proporcionades no eren vàlides.", + "The response is not a streamed response.": "La resposta no és una resposta en streaming.", + "The response is not a view.": "La resposta no és una visió.", + "This action is unauthorized.": "Aquesta acció no està autoritzada.", + "This password reset link will expire in :count minutes.": "Aquest enllaç de restabliment de contrasenya caducarà en :count minuts.", + "to": "a", + "Toggle navigation": "Commutar navegació", + "Too Early": "Massa aviat", + "Too Many Requests": "Massa peticions", + "Translate": "Traduir", + "Translate It": "Tradueix-ho", + "Unauthorized": "No autoritzat", + "Unavailable For Legal Reasons": "No disponible per motius legals", + "Unknown Error": "Error desconegut", + "Unpack": "Desempaquetar", + "Unprocessable Entity": "Entitat no processable", + "Unsubscribe": "Cancel·la la subscripció", + "Unsupported Media Type": "Tipus de suport no compatible", + "Up": "Amunt", + "Update": "Actualització", + "Update :name": "Actualització :name", + "Upgrade Required": "Actualització necessària", + "URI Too Long": "URI massa llarg", + "Use Proxy": "Utilitzeu el proxy", + "User": "Usuari", + "Variant Also Negotiates": "La variant també es negocia", + "Verify Email Address": "Confirmeu la vostra adreça electrònica", + "Verify your email address": "Verifica la teva adreça de correu electrònic", + "View": "Vista", + "View :name": "Vista :name", + "Web Server is Down": "El servidor web està caigut", + "Whoops!": "Vaja!", + "Yes": "Sí", + "You are receiving this email because we received a password reset request for your account.": "Heu rebut aquest correu electrònic perquè s'ha solicitat el restabliment de la contrasenya per al vostre compte." +} \ No newline at end of file diff --git a/lang/ca/actions.php b/lang/ca/actions.php new file mode 100644 index 0000000..2c5f748 --- /dev/null +++ b/lang/ca/actions.php @@ -0,0 +1,119 @@ + 'Acceptar', + 'action' => 'Acció', + 'actions' => 'Accions', + 'add' => 'Afegeix', + 'admin' => 'Admin', + 'agree' => 'Acordar', + 'archive' => 'Arxiu', + 'assign' => 'Assignar', + 'associate' => 'Associat', + 'attach' => 'Adjuntar', + 'browse' => 'Navega', + 'cancel' => 'Cancel · lar', + 'choose' => 'Tria', + 'choose_file' => 'Trieu l\'arxiu', + 'choose_image' => 'Trieu Imatge', + 'click_to_copy' => 'Feu clic per copiar', + 'close' => 'Tanca', + 'collapse' => 'Col·lapse', + 'collapse_all' => 'Col · lapsar tot', + 'comment' => 'Comenta', + 'confirm' => 'Confirmeu', + 'connect' => 'Connecta\'t', + 'create' => 'Crear', + 'delete' => 'Suprimeix', + 'detach' => 'Separar', + 'details' => 'Detalls', + 'disable' => 'Desactivar', + 'discard' => 'Descartar', + 'done' => 'Fet', + 'down' => 'Avall', + 'duplicate' => 'Duplicat', + 'edit' => 'Edita', + 'enable' => 'Activa', + 'expand' => 'Ampliar', + 'expand_all' => 'Amplia-ho tot', + 'explanation' => 'Explicació', + 'export' => 'Exporta', + 'file' => 'Dossier', + 'files' => 'Fitxers', + 'go_home' => 'Aneu a l\'inici', + 'hide' => 'Amaga', + 'home' => 'Inici', + 'image' => 'Imatge', + 'impersonate' => 'Suplantar la identitat', + 'impersonation' => 'Suplantació d\'identitat', + 'import' => 'Importar', + 'introduction' => 'Introducció', + 'like' => 'M\'agrada', + 'load' => 'Carrega', + 'localize' => 'Localitza', + 'log_in' => 'Iniciar Sessió', + 'log_out' => 'Tancar sessió', + 'named' => [ + 'add' => 'Afegeix :name', + 'choose' => 'Trieu :name', + 'create' => 'Crea :name', + 'delete' => 'Suprimeix :name', + 'duplicate' => 'Duplicat: nom', + 'edit' => 'Edita :name', + 'export' => 'Export :name', + 'hide' => 'Amaga :name', + 'import' => 'Importació :name', + 'new' => 'Nou :name', + 'restore' => 'Restaurar :name', + 'save' => 'Estalvia :name', + 'search' => 'Cerca :name', + 'show' => 'Mostra :name', + 'update' => 'Actualització :name', + 'view' => 'Vista :name', + ], + 'new' => 'Nou', + 'no' => 'No', + 'open' => 'Obert', + 'open_website' => 'Obert al lloc web', + 'preview' => 'Vista prèvia', + 'price' => 'Preu', + 'record' => 'Registre', + 'restore' => 'Restaurar', + 'save' => 'Desa', + 'save_and_close' => 'Desa i tanca', + 'save_and_return' => 'Guarda i torna', + 'search' => 'Cerca', + 'select' => 'Seleccioneu', + 'select_all' => 'Seleccionar tot', + 'send' => 'Enviar', + 'settings' => 'Configuració', + 'show' => 'Espectacle', + 'show_all' => 'Mostrar tots', + 'sign_in' => 'Inicieu la sessió', + 'solve' => 'Resol', + 'start' => 'Començar', + 'stop' => 'Atura', + 'submit' => 'Presentar', + 'subscribe' => 'Subscriu-te', + 'switch' => 'Interruptor', + 'switch_to_role' => 'Canvia al rol', + 'tag' => 'Etiqueta', + 'tags' => 'Etiquetes', + 'target_link' => [ + 'blank' => 'Obre en una finestra nova', + 'parent' => 'Obre en un marc principal', + 'self' => 'Obre en una finestra actual', + 'top' => 'Obre al marc superior', + ], + 'translate' => 'Traduir', + 'translate_it' => 'Tradueix-ho', + 'unpack' => 'Desempaquetar', + 'unsubscribe' => 'Cancel·la la subscripció', + 'up' => 'Amunt', + 'update' => 'Actualització', + 'user' => 'Usuari', + 'view' => 'Veure', + 'yes' => 'Sí', +]; diff --git a/lang/ca/auth.php b/lang/ca/auth.php new file mode 100644 index 0000000..8d7e7a6 --- /dev/null +++ b/lang/ca/auth.php @@ -0,0 +1,9 @@ + 'Aquestes credencials no concorden amb els nostres registres.', + 'password' => 'La contrasenya és incorrecta.', + 'throttle' => 'Ha superat el nombre màxim d\'intents d\'accés. Si us plau, torni a intentar-ho en :seconds segons.', +]; diff --git a/lang/ca/http-statuses.php b/lang/ca/http-statuses.php new file mode 100644 index 0000000..7397e01 --- /dev/null +++ b/lang/ca/http-statuses.php @@ -0,0 +1,84 @@ + 'Error desconegut', + '100' => 'Continua', + '101' => 'Protocols de commutació', + '102' => 'Processament', + '200' => 'D\'acord', + '201' => 'Creat', + '202' => 'Acceptat', + '203' => 'Informació no autoritzada', + '204' => 'Sense contingut', + '205' => 'Restablir contingut', + '206' => 'Contingut parcial', + '207' => 'Multiestatus', + '208' => 'Ja s\'ha informat', + '226' => 'IM utilitzat', + '300' => 'Opcions múltiples', + '301' => 'Mogut permanentment', + '302' => 'Trobat', + '303' => 'Vegeu Altres', + '304' => 'No modificat', + '305' => 'Utilitzeu el proxy', + '307' => 'Redirecció temporal', + '308' => 'Redirecció permanent', + '400' => 'Petició dolenta', + '401' => 'No autoritzat', + '402' => 'Pagament obligatori', + '403' => 'Prohibit', + '404' => 'No trobat', + '405' => 'Mètode no permès', + '406' => 'No és acceptable', + '407' => 'Es requereix autenticació de proxy', + '408' => 'Temps d\'espera esgotat', + '409' => 'Conflicte', + '410' => 'Desaparegut', + '411' => 'Longitud requerida', + '412' => 'La condició prèvia ha fallat', + '413' => 'Càrrega útil massa gran', + '414' => 'URI massa llarg', + '415' => 'Tipus de suport no compatible', + '416' => 'Interval no satisfactori', + '417' => 'L\'expectativa ha fallat', + '418' => 'Sóc una tetera', + '419' => 'La sessió ha caducat', + '421' => 'Sol·licitud mal dirigida', + '422' => 'Entitat no processable', + '423' => 'Tancat', + '424' => 'Dependència fallida', + '425' => 'Massa aviat', + '426' => 'Actualització necessària', + '428' => 'Condició prèvia requerida', + '429' => 'Massa sol·licituds', + '431' => 'Els camps de la capçalera de la sol·licitud són massa grans', + '444' => 'Connexió tancada sense resposta', + '449' => 'Torna-ho a provar amb', + '451' => 'No disponible per motius legals', + '499' => 'Sol·licitud de client tancada', + '500' => 'error del servidor intern', + '501' => 'No implementat', + '502' => 'Porta d\'enllaç incorrecta', + '503' => 'mode de manteniment', + '504' => 'Temps d\'espera de la passarel·la', + '505' => 'Versió HTTP no compatible', + '506' => 'La variant també es negocia', + '507' => 'Emmagatzematge insuficient', + '508' => 'Bucle detectat', + '509' => 'Límit d\'ample de banda excedit', + '510' => 'No ampliat', + '511' => 'Es requereix autenticació de xarxa', + '520' => 'Error desconegut', + '521' => 'El servidor web està caigut', + '522' => 'Temps de connexió esgotat', + '523' => 'L\'origen és inabastable', + '524' => 'S\'ha produït un temps mort', + '525' => 'SSL Handshake ha fallat', + '526' => 'Certificat SSL no vàlid', + '527' => 'Error de canó de ferrocarril', + '598' => 'Error de temps d\'espera de lectura de la xarxa', + '599' => 'Error de temps d\'espera de connexió a la xarxa', + 'unknownError' => 'Error desconegut', +]; diff --git a/lang/ca/messages.php b/lang/ca/messages.php new file mode 100644 index 0000000..a8ea3a7 --- /dev/null +++ b/lang/ca/messages.php @@ -0,0 +1,13 @@ + 'Credencials no vàlides.', + 'account_deactivated' => 'Aquest compte està desactivat.', + 'account_pending_approval' => 'El teu compte està pendent d\'aprovació per un administrador.', + 'registration_pending' => 'Compte creat. Un administrador l\'ha d\'aprovar abans que puguis entrar.', + 'cannot_remove_own_admin_role' => 'No et pots treure el rol d\'admin a tu mateix.', + 'cannot_delete_self' => 'No pots esborrar el teu propi compte.', + 'cannot_delete_last_admin' => 'No pots esborrar l\'últim administrador.', + 'self_service_requires_user' => 'Aquest recurs és self-service: necessita un token amb un usuari associat (no funciona amb client_credentials).', + 'user_not_trashed' => 'Aquest usuari no és a la paperera.', +]; diff --git a/lang/ca/pagination.php b/lang/ca/pagination.php new file mode 100644 index 0000000..b59cafe --- /dev/null +++ b/lang/ca/pagination.php @@ -0,0 +1,8 @@ + 'Següent »', + 'previous' => '« Anterior', +]; diff --git a/lang/ca/passwords.php b/lang/ca/passwords.php new file mode 100644 index 0000000..c99cdb2 --- /dev/null +++ b/lang/ca/passwords.php @@ -0,0 +1,11 @@ + 'La contrasenya s\'ha restablert!', + 'sent' => 'Li hem enviat un correu electrònic amb un enllaç per a reiniciar la teva contrasenya!', + 'throttled' => 'Si us plau, esperi abans de tornar-ho a intentar.', + 'token' => 'Aquest token de recuperació de contrasenya és invàlid.', + 'user' => 'No existeix cap usuari amb aquest correu.', +]; diff --git a/lang/ca/validation.php b/lang/ca/validation.php new file mode 100644 index 0000000..210bc80 --- /dev/null +++ b/lang/ca/validation.php @@ -0,0 +1,289 @@ + ':Attribute ha de ser acceptat.', + 'accepted_if' => 'El :attribute s\'ha d\'acceptar quan :other és :value.', + 'active_url' => ':Attribute no és un URL vàlid.', + 'after' => ':Attribute ha de ser una data posterior a :date.', + 'after_or_equal' => ':Attribute ha de ser una data posterior o igual a :date.', + 'alpha' => ':Attribute només pot contenir lletres.', + 'alpha_dash' => ':Attribute només pot contenir lletres, números i guions.', + 'alpha_num' => ':Attribute només pot contenir lletres i números.', + 'any_of' => 'El camp :attribute no és vàlid.', + 'array' => ':Attribute ha de ser una matriu.', + 'ascii' => 'El :attribute només ha de contenir caràcters i símbols alfanumèrics d\'un sol byte.', + 'base64' => 'The :attribute field must be a valid Base64 string.', + 'before' => ':Attribute ha de ser una data anterior a :date.', + 'before_or_equal' => ':Attribute ha de ser una data anterior o igual a :date.', + 'between' => [ + 'array' => ':Attribute ha de tenir entre :min - :max ítems.', + 'file' => ':Attribute ha de pesar entre :min - :max kilobytes.', + 'numeric' => ':Attribute ha d\'estar entre :min - :max.', + 'string' => ':Attribute ha de tenir entre :min - :max caràcters.', + ], + 'boolean' => 'El camp :attribute ha de ser verdader o fals', + 'can' => 'El camp :attribute conté un valor no autoritzat.', + 'confirmed' => 'La confirmació de :attribute no coincideix.', + 'contains' => 'Al camp :attribute li falta un valor obligatori.', + 'current_password' => 'La contrasenya és incorrecta.', + 'date' => ':Attribute no és una data vàlida.', + 'date_equals' => 'El :attribute ha de ser una data igual a :date.', + 'date_format' => 'El camp :attribute no concorda amb el format :format.', + 'decimal' => 'El :attribute ha de tenir :decimal decimals.', + 'declined' => 'Els :attribute s\'han de rebutjar.', + 'declined_if' => 'El :attribute s\'ha de rebutjar quan :other és :value.', + 'different' => ':Attribute i :other han de ser diferents.', + 'digits' => ':Attribute ha de tenir :digits dígits.', + 'digits_between' => ':Attribute ha de tenir entre :min i :max dígits.', + 'dimensions' => 'Les dimensions de la imatge :attribute no són vàlides.', + 'distinct' => 'El camp :attribute té un valor duplicat.', + 'doesnt_contain' => 'El camp :attribute no ha de contenir cap dels següents: :values.', + 'doesnt_end_with' => 'El :attribute no pot acabar amb un dels següents: :values.', + 'doesnt_start_with' => 'El :attribute no pot començar amb un dels següents: :values.', + 'email' => ':Attribute no és un e-mail vàlid', + 'encoding' => 'El camp :attribute s\'ha de codificar en :encoding.', + 'ends_with' => 'La :attribute ha d\'acabar amb una de les següents: :values.', + 'enum' => 'El :attribute seleccionat no és vàlid.', + 'exists' => ':Attribute és invàlid.', + 'extensions' => 'El camp :attribute ha de tenir una de les extensions següents: :values.', + 'file' => 'El camp :attribute ha de ser un arxiu.', + 'filled' => 'El camp :attribute és obligatori.', + 'gt' => [ + 'array' => 'El :attribute ha de tenir més de :value ítems.', + 'file' => 'El :attribute ha de ser superior a :value kilobytes.', + 'numeric' => 'El :attribute ha de ser superior a :value.', + 'string' => 'El :attribute ha de superar els :value caràcters.', + ], + 'gte' => [ + 'array' => 'El :attribute ha de tenir :value ítems o més.', + 'file' => 'El :attribute ha de ser igual o superior a :value kilobytes.', + 'numeric' => 'El :attribute ha de ser igual o superior a :value.', + 'string' => 'El :attribute ha de ser igual o superior a :value caràcters.', + ], + 'hex_color' => 'El camp :attribute ha de ser un color hexadecimal vàlid.', + 'image' => ':Attribute ha de ser una imatge.', + 'in' => ':Attribute és invàlid', + 'in_array' => 'El camp :attribute no existeix dintre de :other.', + 'in_array_keys' => 'El camp :attribute ha de contenir almenys una de les tecles següents: :values.', + 'integer' => ':Attribute ha de ser un nombre enter.', + 'ip' => ':Attribute ha de ser una adreça IP vàlida.', + 'ipv4' => ':Attribute ha de ser una adreça IPv4 vàlida.', + 'ipv6' => ':Attribute ha de ser una adreça IPv6 vàlida.', + 'json' => 'El camp :attribute ha de ser una cadena JSON vàlida.', + 'list' => 'El camp :attribute ha de ser una llista.', + 'lowercase' => 'El :attribute ha d\'anar en minúscula.', + 'lt' => [ + 'array' => 'El :attribute ha de tenir menys de :value ítems.', + 'file' => 'El :attribute ha de ser inferior a :value kilobytes.', + 'numeric' => 'El :attribute ha de ser inferior a :value.', + 'string' => 'El :attribute no ha de superar els :value caràcters.', + ], + 'lte' => [ + 'array' => 'El :attribute no ha de tenir més de :value ítems.', + 'file' => 'El :attribute ha de ser igual o inferior a :value kilobytes.', + 'numeric' => 'El :attribute ha de ser igual o inferior a :value.', + 'string' => 'El :attribute ha de ser igual o inferior a :value caràcters.', + ], + 'mac_address' => 'El :attribute ha de ser una adreça MAC vàlida.', + 'max' => [ + 'array' => ':Attribute no pot tenir més de :max ítems.', + 'file' => ':Attribute no pot ser més gran que :max kilobytes.', + 'numeric' => ':Attribute no pot ser més gran que :max.', + 'string' => ':Attribute no pot ser més gran que :max caràcters.', + ], + 'max_digits' => 'El :attribute no ha de tenir més de :max dígits.', + 'mimes' => ':Attribute ha de ser un arxiu amb format: :values.', + 'mimetypes' => ':Attribute ha de ser un arxiu amb format: :values.', + 'min' => [ + 'array' => ':Attribute ha de tenir almenys :min ítems.', + 'file' => 'La mida de :attribute ha de ser d\'almenys :min kilobytes.', + 'numeric' => 'La mida de :attribute ha de ser d\'almenys :min.', + 'string' => ':Attribute ha de contenir almenys :min caràcters.', + ], + 'min_digits' => 'El :attribute ha de tenir almenys :min dígits.', + 'missing' => 'El camp :attribute ha de faltar.', + 'missing_if' => 'El camp :attribute ha de faltar quan :other és :value.', + 'missing_unless' => 'El camp :attribute ha de faltar, tret que :other sigui :value.', + 'missing_with' => 'El camp :attribute ha de faltar quan hi ha :values.', + 'missing_with_all' => 'El camp :attribute ha de faltar quan n\'hi ha :values.', + 'multiple_of' => 'La :attribute ha de ser un múltiple de :value', + 'not_in' => ':Attribute és invàlid.', + 'not_regex' => 'El format de :attribute no és vàlid.', + 'numeric' => ':Attribute ha de ser numèric.', + 'password' => [ + 'letters' => 'El :attribute ha de contenir almenys una lletra.', + 'mixed' => 'El :attribute ha de contenir almenys una lletra majúscula i una minúscula.', + 'numbers' => 'El :attribute ha de contenir almenys un número.', + 'symbols' => 'El :attribute ha de contenir almenys un símbol.', + 'uncompromised' => 'El :attribute donat ha aparegut en una filtració de dades. Si us plau, trieu un :attribute diferent.', + ], + 'present' => 'El camp :attribute ha d\'existir.', + 'present_if' => 'El camp :attribute ha d\'estar present quan :other és :value.', + 'present_unless' => 'El camp :attribute ha d\'estar present tret que :other sigui :value.', + 'present_with' => 'El camp :attribute ha d\'estar present quan n\'hi ha :values.', + 'present_with_all' => 'El camp :attribute ha d\'estar present quan n\'hi ha :values.', + 'prohibited' => 'La :attribute camp està prohibit.', + 'prohibited_if' => 'La :attribute camp és prohibida quan :other és :value.', + 'prohibited_if_accepted' => 'El camp :attribute està prohibit quan s’accepta :other.', + 'prohibited_if_declined' => 'El camp :attribute està prohibit quan es declina :other.', + 'prohibited_unless' => 'La :attribute camp és prohibida, tret que :other és en :values.', + 'prohibits' => 'El camp :attribute prohibeix la presència de :other.', + 'regex' => 'El format de :attribute és invàlid.', + 'required' => 'El camp :attribute és obligatori.', + 'required_array_keys' => 'El camp :attribute ha de contenir entrades per a: :values.', + 'required_if' => 'El camp :attribute és obligatori quan :other és :value.', + 'required_if_accepted' => 'El camp :attribute és obligatori quan s\'accepta :other.', + 'required_if_declined' => 'El camp :attribute és obligatori quan es rebutja :other.', + 'required_unless' => 'El camp :attribute és obligatori a no ser que :other sigui a :values.', + 'required_with' => 'El camp :attribute és obligatori quan hi ha :values.', + 'required_with_all' => 'El camp :attribute és obligatori quan hi ha :values.', + 'required_without' => 'El camp :attribute és obligatori quan no hi ha :values.', + 'required_without_all' => 'El camp :attribute és obligatori quan no hi ha cap valor dels següents: :values.', + 'same' => ':Attribute i :other han de coincidir.', + 'size' => [ + 'array' => ':Attribute ha de contenir :size ítems.', + 'file' => 'La mida de :attribute ha de ser :size kilobytes.', + 'numeric' => 'La mida de :attribute ha de ser :size.', + 'string' => ':Attribute ha de contenir :size caràcters.', + ], + 'starts_with' => 'El :attribute ha de començar per un dels valors següents: :values', + 'string' => 'El camp :attribute ha de ser una cadena.', + 'timezone' => 'El camp :attribute ha de ser una zona vàlida.', + 'ulid' => 'El :attribute ha de ser un ULID vàlid.', + 'unique' => ':Attribute ja està registrat i no es pot repetir.', + 'uploaded' => ':Attribute ha fallat al pujar.', + 'uppercase' => 'El :attribute ha d\'anar en majúscula.', + 'url' => ':Attribute no és una adreça web vàlida.', + 'uuid' => 'El :attribute ha de ser un indentificador únic universal (UUID) vàlid.', + 'attributes' => [ + 'address' => 'adreça', + 'affiliate_url' => 'URL d\'afiliat', + 'age' => 'edat', + 'amount' => 'quantitat', + 'announcement' => 'anunci', + 'area' => 'zona', + 'audience_prize' => 'premi del públic', + 'audience_winner' => 'audience winner', + 'available' => 'disponible', + 'birthday' => 'aniversari', + 'body' => 'cos', + 'city' => 'ciutat', + 'color' => 'color', + 'company' => 'company', + 'compilation' => 'compilació', + 'concept' => 'concepte', + 'conditions' => 'condicions', + 'content' => 'contingut', + 'contest' => 'contest', + 'country' => 'país', + 'cover' => 'coberta', + 'created_at' => 'creat a', + 'creator' => 'creador', + 'currency' => 'moneda', + 'current_password' => 'Contrasenya actual', + 'customer' => 'client', + 'date' => 'data', + 'date_of_birth' => 'data de naixement', + 'dates' => 'dates', + 'day' => 'dia', + 'deleted_at' => 'esborrat a les', + 'description' => 'descripció', + 'display_type' => 'tipus de visualització', + 'district' => 'districte', + 'duration' => 'durada', + 'email' => 'adreça electrònica', + 'excerpt' => 'extracte', + 'filter' => 'filtre', + 'finished_at' => 'acabat a les', + 'first_name' => 'nom', + 'gender' => 'gènere', + 'grand_prize' => 'gran premi', + 'group' => 'grup', + 'hour' => 'hora', + 'image' => 'imatge', + 'image_desktop' => 'imatge d\'escriptori', + 'image_main' => 'imatge principal', + 'image_mobile' => 'imatge mòbil', + 'images' => 'imatges', + 'is_audience_winner' => 'és el guanyador del públic', + 'is_hidden' => 'està amagat', + 'is_subscribed' => 'està subscrit', + 'is_visible' => 'és visible', + 'is_winner' => 'és el guanyador', + 'items' => 'elements', + 'key' => 'clau', + 'last_name' => 'cognom', + 'lesson' => 'lliçó', + 'line_address_1' => 'adreça de línia 1', + 'line_address_2' => 'adreça de línia 2', + 'login' => 'iniciar Sessió', + 'message' => 'missatge', + 'middle_name' => 'segon nom', + 'minute' => 'minut', + 'mobile' => 'mòbil', + 'month' => 'mes', + 'name' => 'nom', + 'national_code' => 'codi nacional', + 'number' => 'nombre', + 'password' => 'contrasenya', + 'password_confirmation' => 'confirmació de la contrasenya', + 'phone' => 'telèfon', + 'photo' => 'foto', + 'portfolio' => 'cartera', + 'postal_code' => 'Codi Postal', + 'preview' => 'Vista prèvia', + 'price' => 'preu', + 'product_id' => 'ID del producte', + 'product_uid' => 'UID del producte', + 'product_uuid' => 'UUID del producte', + 'promo_code' => 'codi promocional', + 'province' => 'província', + 'quantity' => 'quantitat', + 'reason' => 'raó', + 'recaptcha_response_field' => 'camp de resposta recaptcha', + 'referee' => 'àrbitre', + 'referees' => 'àrbitres', + 'region' => 'region', + 'reject_reason' => 'rebutjar la raó', + 'remember' => 'recorda', + 'restored_at' => 'restaurat a', + 'result_text_under_image' => 'text del resultat sota la imatge', + 'role' => 'paper', + 'rule' => 'regla', + 'rules' => 'regles', + 'second' => 'segon', + 'sex' => 'sexe', + 'shipment' => 'enviament', + 'short_text' => 'text breu', + 'size' => 'mida', + 'skills' => 'habilitats', + 'slug' => 'llimac', + 'specialization' => 'especialització', + 'started_at' => 'va començar a', + 'state' => 'estat', + 'status' => 'estat', + 'street' => 'carrer', + 'student' => 'estudiant', + 'subject' => 'assumpte', + 'tag' => 'etiqueta', + 'tags' => 'etiquetes', + 'teacher' => 'professor', + 'terms' => 'termes', + 'test_description' => 'descripció de la prova', + 'test_locale' => 'localització de prova', + 'test_name' => 'nom de la prova', + 'text' => 'text', + 'time' => 'hora', + 'title' => 'títol', + 'type' => 'tipus', + 'updated_at' => 'actualitzat a', + 'user' => 'usuari', + 'username' => 'usuari', + 'value' => 'valor', + 'winner' => 'winner', + 'work' => 'work', + 'year' => 'any', + ], +]; diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 0000000..e7d6c0e --- /dev/null +++ b/lang/en.json @@ -0,0 +1,229 @@ +{ + "(and :count more error)": "(and :count more error)", + "(and :count more errors)": "(and :count more error)|(and :count more errors)|(and :count more errors)", + "A decryption key is required.": "A decryption key is required.", + "A Timeout Occurred": "A Timeout Occurred", + "Accept": "Accept", + "Accepted": "Accepted", + "Action": "Action", + "Actions": "Actions", + "Add": "Add", + "Add :name": "Add :name", + "Admin": "Admin", + "Agree": "Agree", + "All rights reserved.": "All rights reserved.", + "Already Reported": "Already Reported", + "Archive": "Archive", + "Assign": "Assign", + "Associate": "Associate", + "Attach": "Attach", + "Bad Gateway": "Bad Gateway", + "Bad Request": "Bad Request", + "Bandwidth Limit Exceeded": "Bandwidth Limit Exceeded", + "Browse": "Browse", + "Cancel": "Cancel", + "Choose": "Choose", + "Choose :name": "Choose :name", + "Choose File": "Choose File", + "Choose Image": "Choose Image", + "Click to copy": "Click to copy", + "Client Closed Request": "Client Closed Request", + "Close": "Close", + "Collapse": "Collapse", + "Collapse All": "Collapse All", + "Comment": "Comment", + "Confirm": "Confirm", + "Conflict": "Conflict", + "Connect": "Connect", + "Connection Closed Without Response": "Connection Closed Without Response", + "Connection Timed Out": "Connection Timed Out", + "Continue": "Continue", + "Create": "Create", + "Create :name": "Create :name", + "Created": "Created", + "Delete": "Delete", + "Delete :name": "Delete :name", + "Detach": "Detach", + "Details": "Details", + "Disable": "Disable", + "Discard": "Discard", + "Done": "Done", + "Down": "Down", + "Duplicate": "Duplicate", + "Duplicate :name": "Duplicate :name", + "Edit": "Edit", + "Edit :name": "Edit :name", + "Enable": "Enable", + "Encrypted environment file already exists.": "Encrypted environment file already exists.", + "Encrypted environment file not found.": "Encrypted environment file not found.", + "Environment file already exists.": "Environment file already exists.", + "Environment file not found.": "Environment file not found.", + "errors": "errors", + "Expand": "Expand", + "Expand All": "Expand All", + "Expectation Failed": "Expectation Failed", + "Explanation": "Explanation", + "Export": "Export", + "Export :name": "Export :name", + "Failed Dependency": "Failed Dependency", + "File": "File", + "Files": "Files", + "Forbidden": "Forbidden", + "Found": "Found", + "Gateway Timeout": "Gateway Timeout", + "Go Home": "Go Home", + "Go to page :page": "Go to page :page", + "Gone": "Gone", + "Hello!": "Hello!", + "Hide": "Hide", + "Hide :name": "Hide :name", + "Home": "Home", + "HTTP Version Not Supported": "HTTP Version Not Supported", + "I'm a teapot": "I'm a teapot", + "If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.", + "If you did not request a password reset, no further action is required.": "If you did not request a password reset, no further action is required.", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:", + "IM Used": "IM Used", + "Image": "Image", + "Impersonate": "Impersonate", + "Impersonation": "Impersonation", + "Import": "Import", + "Import :name": "Import :name", + "Insufficient Storage": "Insufficient Storage", + "Internal Server Error": "Internal Server Error", + "Introduction": "Introduction", + "Invalid filename.": "Invalid filename.", + "Invalid JSON was returned from the route.": "Invalid JSON was returned from the route.", + "Invalid SSL Certificate": "Invalid SSL Certificate", + "Length Required": "Length Required", + "Like": "Like", + "Load": "Load", + "Localize": "Localize", + "Location": "Location", + "Locked": "Locked", + "Log In": "Log In", + "Log Out": "Log Out", + "Login": "Login", + "Logout": "Logout", + "Loop Detected": "Loop Detected", + "Maintenance Mode": "Maintenance Mode", + "Method Not Allowed": "Method Not Allowed", + "Misdirected Request": "Misdirected Request", + "Moved Permanently": "Moved Permanently", + "Multi-Status": "Multi-Status", + "Multiple Choices": "Multiple Choices", + "Network Authentication Required": "Network Authentication Required", + "Network Connect Timeout Error": "Network Connect Timeout Error", + "Network Read Timeout Error": "Network Read Timeout Error", + "New": "New", + "New :name": "New :name", + "No": "No", + "No Content": "No Content", + "Non-Authoritative Information": "Non-Authoritative Information", + "Not Acceptable": "Not Acceptable", + "Not Extended": "Not Extended", + "Not Found": "Not Found", + "Not Implemented": "Not Implemented", + "Not Modified": "Not Modified", + "of": "of", + "OK": "OK", + "Open": "Open", + "Open in a current window": "Open in a current window", + "Open in a new window": "Open in a new window", + "Open in a parent frame": "Open in a parent frame", + "Open in the topmost frame": "Open in the topmost frame", + "Open on the website": "Open on the website", + "Origin Is Unreachable": "Origin Is Unreachable", + "Page Expired": "Page Expired", + "Pagination Navigation": "Pagination Navigation", + "Partial Content": "Partial Content", + "Payload Too Large": "Payload Too Large", + "Payment Required": "Payment Required", + "Permanent Redirect": "Permanent Redirect", + "Please click the button below to verify your email address.": "Please click the button below to verify your email address.", + "Precondition Failed": "Precondition Failed", + "Precondition Required": "Precondition Required", + "Preview": "Preview", + "Price": "Price", + "Processing": "Processing", + "Proxy Authentication Required": "Proxy Authentication Required", + "Railgun Error": "Railgun Error", + "Range Not Satisfiable": "Range Not Satisfiable", + "Record": "Record", + "Regards,": "Regards,", + "Register": "Register", + "Request Header Fields Too Large": "Request Header Fields Too Large", + "Request Timeout": "Request Timeout", + "Reset Content": "Reset Content", + "Reset Password": "Reset Password", + "Reset your password": "Reset your password", + "Restore": "Restore", + "Restore :name": "Restore :name", + "results": "results", + "Retry With": "Retry With", + "Save": "Save", + "Save & Close": "Save & Close", + "Save & Return": "Save & Return", + "Save :name": "Save :name", + "Search": "Search", + "Search :name": "Search :name", + "See Other": "See Other", + "Select": "Select", + "Select All": "Select All", + "Send": "Send", + "Server Error": "Server Error", + "Service Unavailable": "Service Unavailable", + "Session Has Expired": "Session Has Expired", + "Settings": "Settings", + "Show": "Show", + "Show :name": "Show :name", + "Show All": "Show All", + "Showing": "Showing", + "Sign In": "Sign In", + "Solve": "Solve", + "SSL Handshake Failed": "SSL Handshake Failed", + "Start": "Start", + "Stop": "Stop", + "Submit": "Submit", + "Subscribe": "Subscribe", + "Switch": "Switch", + "Switch To Role": "Switch To Role", + "Switching Protocols": "Switching Protocols", + "Tag": "Tag", + "Tags": "Tags", + "Temporary Redirect": "Temporary Redirect", + "The given data was invalid.": "The given data was invalid.", + "The response is not a streamed response.": "The response is not a streamed response.", + "The response is not a view.": "The response is not a view.", + "This action is unauthorized.": "This action is unauthorized.", + "This password reset link will expire in :count minutes.": "This password reset link will expire in :count minutes.", + "to": "to", + "Toggle navigation": "Toggle navigation", + "Too Early": "Too Early", + "Too Many Requests": "Too Many Requests", + "Translate": "Translate", + "Translate It": "Translate It", + "Unauthorized": "Unauthorized", + "Unavailable For Legal Reasons": "Unavailable For Legal Reasons", + "Unknown Error": "Unknown Error", + "Unpack": "Unpack", + "Unprocessable Entity": "Unprocessable Entity", + "Unsubscribe": "Unsubscribe", + "Unsupported Media Type": "Unsupported Media Type", + "Up": "Up", + "Update": "Update", + "Update :name": "Update :name", + "Upgrade Required": "Upgrade Required", + "URI Too Long": "URI Too Long", + "Use Proxy": "Use Proxy", + "User": "User", + "Variant Also Negotiates": "Variant Also Negotiates", + "Verify Email Address": "Verify Email Address", + "Verify your email address": "Verify your email address", + "View": "View", + "View :name": "View :name", + "Web Server is Down": "Web Server is Down", + "Whoops!": "Whoops!", + "Yes": "Yes", + "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account." +} \ No newline at end of file diff --git a/lang/en/actions.php b/lang/en/actions.php new file mode 100644 index 0000000..7ff2b68 --- /dev/null +++ b/lang/en/actions.php @@ -0,0 +1,119 @@ + 'Accept', + 'action' => 'Action', + 'actions' => 'Actions', + 'add' => 'Add', + 'admin' => 'Admin', + 'agree' => 'Agree', + 'archive' => 'Archive', + 'assign' => 'Assign', + 'associate' => 'Associate', + 'attach' => 'Attach', + 'browse' => 'Browse', + 'cancel' => 'Cancel', + 'choose' => 'Choose', + 'choose_file' => 'Choose File', + 'choose_image' => 'Choose Image', + 'click_to_copy' => 'Click to copy', + 'close' => 'Close', + 'collapse' => 'Collapse', + 'collapse_all' => 'Collapse All', + 'comment' => 'Comment', + 'confirm' => 'Confirm', + 'connect' => 'Connect', + 'create' => 'Create', + 'delete' => 'Delete', + 'detach' => 'Detach', + 'details' => 'Details', + 'disable' => 'Disable', + 'discard' => 'Discard', + 'done' => 'Done', + 'down' => 'Down', + 'duplicate' => 'Duplicate', + 'edit' => 'Edit', + 'enable' => 'Enable', + 'expand' => 'Expand', + 'expand_all' => 'Expand All', + 'explanation' => 'Explanation', + 'export' => 'Export', + 'file' => 'File', + 'files' => 'Files', + 'go_home' => 'Go Home', + 'hide' => 'Hide', + 'home' => 'Home', + 'image' => 'Image', + 'impersonate' => 'Impersonate', + 'impersonation' => 'Impersonation', + 'import' => 'Import', + 'introduction' => 'Introduction', + 'like' => 'Like', + 'load' => 'Load', + 'localize' => 'Localize', + 'log_in' => 'Log In', + 'log_out' => 'Log Out', + 'named' => [ + 'add' => 'Add :name', + 'choose' => 'Choose :name', + 'create' => 'Create :name', + 'delete' => 'Delete :name', + 'duplicate' => 'Duplicate :name', + 'edit' => 'Edit :name', + 'export' => 'Export :name', + 'hide' => 'Hide :name', + 'import' => 'Import :name', + 'new' => 'New :name', + 'restore' => 'Restore :name', + 'save' => 'Save :name', + 'search' => 'Search :name', + 'show' => 'Show :name', + 'update' => 'Update :name', + 'view' => 'View :name', + ], + 'new' => 'New', + 'no' => 'No', + 'open' => 'Open', + 'open_website' => 'Open on the website', + 'preview' => 'Preview', + 'price' => 'Price', + 'record' => 'Record', + 'restore' => 'Restore', + 'save' => 'Save', + 'save_and_close' => 'Save & Close', + 'save_and_return' => 'Save & Return', + 'search' => 'Search', + 'select' => 'Select', + 'select_all' => 'Select All', + 'send' => 'Send', + 'settings' => 'Settings', + 'show' => 'Show', + 'show_all' => 'Show All', + 'sign_in' => 'Sign In', + 'solve' => 'Solve', + 'start' => 'Start', + 'stop' => 'Stop', + 'submit' => 'Submit', + 'subscribe' => 'Subscribe', + 'switch' => 'Switch', + 'switch_to_role' => 'Switch To Role', + 'tag' => 'Tag', + 'tags' => 'Tags', + 'target_link' => [ + 'blank' => 'Open in a new window', + 'parent' => 'Open in a parent frame', + 'self' => 'Open in a current window', + 'top' => 'Open in the topmost frame', + ], + 'translate' => 'Translate', + 'translate_it' => 'Translate It', + 'unpack' => 'Unpack', + 'unsubscribe' => 'Unsubscribe', + 'up' => 'Up', + 'update' => 'Update', + 'user' => 'User', + 'view' => 'View', + 'yes' => 'Yes', +]; diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..ad725d8 --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,9 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', +]; diff --git a/lang/en/http-statuses.php b/lang/en/http-statuses.php new file mode 100644 index 0000000..3346f78 --- /dev/null +++ b/lang/en/http-statuses.php @@ -0,0 +1,84 @@ + 'Unknown Error', + '100' => 'Continue', + '101' => 'Switching Protocols', + '102' => 'Processing', + '200' => 'OK', + '201' => 'Created', + '202' => 'Accepted', + '203' => 'Non-Authoritative Information', + '204' => 'No Content', + '205' => 'Reset Content', + '206' => 'Partial Content', + '207' => 'Multi-Status', + '208' => 'Already Reported', + '226' => 'IM Used', + '300' => 'Multiple Choices', + '301' => 'Moved Permanently', + '302' => 'Found', + '303' => 'See Other', + '304' => 'Not Modified', + '305' => 'Use Proxy', + '307' => 'Temporary Redirect', + '308' => 'Permanent Redirect', + '400' => 'Bad Request', + '401' => 'Unauthorized', + '402' => 'Payment Required', + '403' => 'Forbidden', + '404' => 'Not Found', + '405' => 'Method Not Allowed', + '406' => 'Not Acceptable', + '407' => 'Proxy Authentication Required', + '408' => 'Request Timeout', + '409' => 'Conflict', + '410' => 'Gone', + '411' => 'Length Required', + '412' => 'Precondition Failed', + '413' => 'Payload Too Large', + '414' => 'URI Too Long', + '415' => 'Unsupported Media Type', + '416' => 'Range Not Satisfiable', + '417' => 'Expectation Failed', + '418' => 'I\'m a teapot', + '419' => 'Session Has Expired', + '421' => 'Misdirected Request', + '422' => 'Unprocessable Entity', + '423' => 'Locked', + '424' => 'Failed Dependency', + '425' => 'Too Early', + '426' => 'Upgrade Required', + '428' => 'Precondition Required', + '429' => 'Too Many Requests', + '431' => 'Request Header Fields Too Large', + '444' => 'Connection Closed Without Response', + '449' => 'Retry With', + '451' => 'Unavailable For Legal Reasons', + '499' => 'Client Closed Request', + '500' => 'Internal Server Error', + '501' => 'Not Implemented', + '502' => 'Bad Gateway', + '503' => 'Maintenance Mode', + '504' => 'Gateway Timeout', + '505' => 'HTTP Version Not Supported', + '506' => 'Variant Also Negotiates', + '507' => 'Insufficient Storage', + '508' => 'Loop Detected', + '509' => 'Bandwidth Limit Exceeded', + '510' => 'Not Extended', + '511' => 'Network Authentication Required', + '520' => 'Unknown Error', + '521' => 'Web Server is Down', + '522' => 'Connection Timed Out', + '523' => 'Origin Is Unreachable', + '524' => 'A Timeout Occurred', + '525' => 'SSL Handshake Failed', + '526' => 'Invalid SSL Certificate', + '527' => 'Railgun Error', + '598' => 'Network Read Timeout Error', + '599' => 'Network Connect Timeout Error', + 'unknownError' => 'Unknown Error', +]; diff --git a/lang/en/messages.php b/lang/en/messages.php new file mode 100644 index 0000000..0100f4a --- /dev/null +++ b/lang/en/messages.php @@ -0,0 +1,13 @@ + 'Invalid credentials.', + 'account_deactivated' => 'This account is deactivated.', + 'account_pending_approval' => 'Your account is pending approval by an administrator.', + 'registration_pending' => 'Account created. An administrator has to approve it before you can sign in.', + 'cannot_remove_own_admin_role' => "You can't remove your own admin role.", + 'cannot_delete_self' => "You can't delete your own account.", + 'cannot_delete_last_admin' => "You can't delete the last administrator.", + 'self_service_requires_user' => 'This resource is self-service: it needs a token with an associated user (does not work with client_credentials).', + 'user_not_trashed' => 'This user is not in the trash.', +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..f4cedde --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,8 @@ + 'Next »', + 'previous' => '« Previous', +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 0000000..f3b65ba --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,11 @@ + 'Your password has been reset.', + 'sent' => 'We have emailed your password reset link.', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => 'We can\'t find a user with that email address.', +]; diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..71ffea4 --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,289 @@ + 'The :attribute field must be accepted.', + 'accepted_if' => 'The :attribute field must be accepted when :other is :value.', + 'active_url' => 'The :attribute field must be a valid URL.', + 'after' => 'The :attribute field must be a date after :date.', + 'after_or_equal' => 'The :attribute field must be a date after or equal to :date.', + 'alpha' => 'The :attribute field must only contain letters.', + 'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.', + 'alpha_num' => 'The :attribute field must only contain letters and numbers.', + 'any_of' => 'The :attribute field is invalid.', + 'array' => 'The :attribute field must be an array.', + 'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.', + 'base64' => 'The :attribute field must be a valid Base64 string.', + 'before' => 'The :attribute field must be a date before :date.', + 'before_or_equal' => 'The :attribute field must be a date before or equal to :date.', + 'between' => [ + 'array' => 'The :attribute field must have between :min and :max items.', + 'file' => 'The :attribute field must be between :min and :max kilobytes.', + 'numeric' => 'The :attribute field must be between :min and :max.', + 'string' => 'The :attribute field must be between :min and :max characters.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'can' => 'The :attribute field contains an unauthorized value.', + 'confirmed' => 'The :attribute field confirmation does not match.', + 'contains' => 'The :attribute field is missing a required value.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute field must be a valid date.', + 'date_equals' => 'The :attribute field must be a date equal to :date.', + 'date_format' => 'The :attribute field must match the format :format.', + 'decimal' => 'The :attribute field must have :decimal decimal places.', + 'declined' => 'The :attribute field must be declined.', + 'declined_if' => 'The :attribute field must be declined when :other is :value.', + 'different' => 'The :attribute field and :other must be different.', + 'digits' => 'The :attribute field must be :digits digits.', + 'digits_between' => 'The :attribute field must be between :min and :max digits.', + 'dimensions' => 'The :attribute field has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_contain' => 'The :attribute field must not contain any of the following: :values.', + 'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.', + 'email' => 'The :attribute field must be a valid email address.', + 'encoding' => 'The :attribute field must be encoded in :encoding.', + 'ends_with' => 'The :attribute field must end with one of the following: :values.', + 'enum' => 'The selected :attribute is invalid.', + 'exists' => 'The selected :attribute is invalid.', + 'extensions' => 'The :attribute field must have one of the following extensions: :values.', + 'file' => 'The :attribute field must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'array' => 'The :attribute field must have more than :value items.', + 'file' => 'The :attribute field must be greater than :value kilobytes.', + 'numeric' => 'The :attribute field must be greater than :value.', + 'string' => 'The :attribute field must be greater than :value characters.', + ], + 'gte' => [ + 'array' => 'The :attribute field must have :value items or more.', + 'file' => 'The :attribute field must be greater than or equal to :value kilobytes.', + 'numeric' => 'The :attribute field must be greater than or equal to :value.', + 'string' => 'The :attribute field must be greater than or equal to :value characters.', + ], + 'hex_color' => 'The :attribute field must be a valid hexadecimal color.', + 'image' => 'The :attribute field must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field must exist in :other.', + 'in_array_keys' => 'The :attribute field must contain at least one of the following keys: :values.', + 'integer' => 'The :attribute field must be an integer.', + 'ip' => 'The :attribute field must be a valid IP address.', + 'ipv4' => 'The :attribute field must be a valid IPv4 address.', + 'ipv6' => 'The :attribute field must be a valid IPv6 address.', + 'json' => 'The :attribute field must be a valid JSON string.', + 'list' => 'The :attribute field must be a list.', + 'lowercase' => 'The :attribute field must be lowercase.', + 'lt' => [ + 'array' => 'The :attribute field must have less than :value items.', + 'file' => 'The :attribute field must be less than :value kilobytes.', + 'numeric' => 'The :attribute field must be less than :value.', + 'string' => 'The :attribute field must be less than :value characters.', + ], + 'lte' => [ + 'array' => 'The :attribute field must not have more than :value items.', + 'file' => 'The :attribute field must be less than or equal to :value kilobytes.', + 'numeric' => 'The :attribute field must be less than or equal to :value.', + 'string' => 'The :attribute field must be less than or equal to :value characters.', + ], + 'mac_address' => 'The :attribute field must be a valid MAC address.', + 'max' => [ + 'array' => 'The :attribute field must not have more than :max items.', + 'file' => 'The :attribute field must not be greater than :max kilobytes.', + 'numeric' => 'The :attribute field must not be greater than :max.', + 'string' => 'The :attribute field must not be greater than :max characters.', + ], + 'max_digits' => 'The :attribute field must not have more than :max digits.', + 'mimes' => 'The :attribute field must be a file of type: :values.', + 'mimetypes' => 'The :attribute field must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute field must have at least :min items.', + 'file' => 'The :attribute field must be at least :min kilobytes.', + 'numeric' => 'The :attribute field must be at least :min.', + 'string' => 'The :attribute field must be at least :min characters.', + ], + 'min_digits' => 'The :attribute field must have at least :min digits.', + 'missing' => 'The :attribute field must be missing.', + 'missing_if' => 'The :attribute field must be missing when :other is :value.', + 'missing_unless' => 'The :attribute field must be missing unless :other is :value.', + 'missing_with' => 'The :attribute field must be missing when :values is present.', + 'missing_with_all' => 'The :attribute field must be missing when :values are present.', + 'multiple_of' => 'The :attribute field must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute field format is invalid.', + 'numeric' => 'The :attribute field must be a number.', + 'password' => [ + 'letters' => 'The :attribute field must contain at least one letter.', + 'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.', + 'numbers' => 'The :attribute field must contain at least one number.', + 'symbols' => 'The :attribute field must contain at least one symbol.', + 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', + ], + 'present' => 'The :attribute field must be present.', + 'present_if' => 'The :attribute field must be present when :other is :value.', + 'present_unless' => 'The :attribute field must be present unless :other is :value.', + 'present_with' => 'The :attribute field must be present when :values is present.', + 'present_with_all' => 'The :attribute field must be present when :values are present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.', + 'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => 'The :attribute field format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_array_keys' => 'The :attribute field must contain entries for: :values.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_if_accepted' => 'The :attribute field is required when :other is accepted.', + 'required_if_declined' => 'The :attribute field is required when :other is declined.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute field must match :other.', + 'size' => [ + 'array' => 'The :attribute field must contain :size items.', + 'file' => 'The :attribute field must be :size kilobytes.', + 'numeric' => 'The :attribute field must be :size.', + 'string' => 'The :attribute field must be :size characters.', + ], + 'starts_with' => 'The :attribute field must start with one of the following: :values.', + 'string' => 'The :attribute field must be a string.', + 'timezone' => 'The :attribute field must be a valid timezone.', + 'ulid' => 'The :attribute field must be a valid ULID.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'uppercase' => 'The :attribute field must be uppercase.', + 'url' => 'The :attribute field must be a valid URL.', + 'uuid' => 'The :attribute field must be a valid UUID.', + 'attributes' => [ + 'address' => 'address', + 'affiliate_url' => 'affiliate URL', + 'age' => 'age', + 'amount' => 'amount', + 'announcement' => 'announcement', + 'area' => 'area', + 'audience_prize' => 'audience prize', + 'audience_winner' => 'audience winner', + 'available' => 'available', + 'birthday' => 'birthday', + 'body' => 'body', + 'city' => 'city', + 'color' => 'color', + 'company' => 'company', + 'compilation' => 'compilation', + 'concept' => 'concept', + 'conditions' => 'conditions', + 'content' => 'content', + 'contest' => 'contest', + 'country' => 'country', + 'cover' => 'cover', + 'created_at' => 'created at', + 'creator' => 'creator', + 'currency' => 'currency', + 'current_password' => 'current password', + 'customer' => 'customer', + 'date' => 'date', + 'date_of_birth' => 'date of birth', + 'dates' => 'dates', + 'day' => 'day', + 'deleted_at' => 'deleted at', + 'description' => 'description', + 'display_type' => 'display type', + 'district' => 'district', + 'duration' => 'duration', + 'email' => 'email', + 'excerpt' => 'excerpt', + 'filter' => 'filter', + 'finished_at' => 'finished at', + 'first_name' => 'first name', + 'gender' => 'gender', + 'grand_prize' => 'grand prize', + 'group' => 'group', + 'hour' => 'hour', + 'image' => 'image', + 'image_desktop' => 'desktop image', + 'image_main' => 'main image', + 'image_mobile' => 'mobile image', + 'images' => 'images', + 'is_audience_winner' => 'is audience winner', + 'is_hidden' => 'is hidden', + 'is_subscribed' => 'is subscribed', + 'is_visible' => 'is visible', + 'is_winner' => 'is winner', + 'items' => 'items', + 'key' => 'key', + 'last_name' => 'last name', + 'lesson' => 'lesson', + 'line_address_1' => 'line address 1', + 'line_address_2' => 'line address 2', + 'login' => 'login', + 'message' => 'message', + 'middle_name' => 'middle name', + 'minute' => 'minute', + 'mobile' => 'mobile', + 'month' => 'month', + 'name' => 'name', + 'national_code' => 'national code', + 'number' => 'number', + 'password' => 'password', + 'password_confirmation' => 'password confirmation', + 'phone' => 'phone', + 'photo' => 'photo', + 'portfolio' => 'portfolio', + 'postal_code' => 'postal code', + 'preview' => 'preview', + 'price' => 'price', + 'product_id' => 'product ID', + 'product_uid' => 'product UID', + 'product_uuid' => 'product UUID', + 'promo_code' => 'promo code', + 'province' => 'province', + 'quantity' => 'quantity', + 'reason' => 'reason', + 'recaptcha_response_field' => 'recaptcha response field', + 'referee' => 'referee', + 'referees' => 'referees', + 'region' => 'region', + 'reject_reason' => 'reject reason', + 'remember' => 'remember', + 'restored_at' => 'restored at', + 'result_text_under_image' => 'result text under image', + 'role' => 'role', + 'rule' => 'rule', + 'rules' => 'rules', + 'second' => 'second', + 'sex' => 'sex', + 'shipment' => 'shipment', + 'short_text' => 'short text', + 'size' => 'size', + 'skills' => 'skills', + 'slug' => 'slug', + 'specialization' => 'specialization', + 'started_at' => 'started at', + 'state' => 'state', + 'status' => 'status', + 'street' => 'street', + 'student' => 'student', + 'subject' => 'subject', + 'tag' => 'tag', + 'tags' => 'tags', + 'teacher' => 'teacher', + 'terms' => 'terms', + 'test_description' => 'test description', + 'test_locale' => 'test locale', + 'test_name' => 'test name', + 'text' => 'text', + 'time' => 'time', + 'title' => 'title', + 'type' => 'type', + 'updated_at' => 'updated at', + 'user' => 'user', + 'username' => 'username', + 'value' => 'value', + 'winner' => 'winner', + 'work' => 'work', + 'year' => 'year', + ], +]; diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 0000000..70ce891 --- /dev/null +++ b/lang/es.json @@ -0,0 +1,229 @@ +{ + "(and :count more error)": "(y :count error más)", + "(and :count more errors)": "(y :count error más)|(y :count errores más)|(y :count errores más)", + "A decryption key is required.": "Se requiere una clave de descifrado.", + "A Timeout Occurred": "Se produjo un tiempo de espera", + "Accept": "Aceptar", + "Accepted": "Aceptado", + "Action": "Acción", + "Actions": "Acciones", + "Add": "Añadir", + "Add :name": "Agregar :name", + "Admin": "Administrar", + "Agree": "Aceptar", + "All rights reserved.": "Todos los derechos reservados.", + "Already Reported": "Ya Reportado", + "Archive": "Archivar", + "Assign": "Asignar", + "Associate": "Asociar", + "Attach": "Adjuntar", + "Bad Gateway": "Mala puerta de enlace", + "Bad Request": "Solicitud incorrecta", + "Bandwidth Limit Exceeded": "Límite de ancho de banda excedido", + "Browse": "Navegar", + "Cancel": "Cancelar", + "Choose": "Elija", + "Choose :name": "Elegir :name", + "Choose File": "Elija archivo", + "Choose Image": "Elegir Imagen", + "Click to copy": "Haga clic para copiar", + "Client Closed Request": "Solicitud cerrada del cliente", + "Close": "Cerrar", + "Collapse": "Colapsar", + "Collapse All": "Colapsar todo", + "Comment": "Comentar", + "Confirm": "Confirmar", + "Conflict": "Conflicto", + "Connect": "Conectar", + "Connection Closed Without Response": "Conexión cerrada sin respuesta", + "Connection Timed Out": "Tiempo de conexión agotado", + "Continue": "Continuar", + "Create": "Crear", + "Create :name": "Crear :name", + "Created": "Creado", + "Delete": "Eliminar", + "Delete :name": "Eliminar :name", + "Detach": "Desvincular", + "Details": "Detalles", + "Disable": "Deshabilitar", + "Discard": "Descartar", + "Done": "Hecho", + "Down": "Abajo", + "Duplicate": "Duplicar", + "Duplicate :name": "Duplicar :name", + "Edit": "Editar", + "Edit :name": "Editar :name", + "Enable": "Habilitar", + "Encrypted environment file already exists.": "El archivo de entorno cifrado ya existe.", + "Encrypted environment file not found.": "No se encontró el archivo de entorno cifrado.", + "Environment file already exists.": "El archivo de entorno ya existe.", + "Environment file not found.": "Archivo de entorno no encontrado.", + "errors": "errores", + "Expand": "Expandir", + "Expand All": "Expandir todo", + "Expectation Failed": "Expectativa fallida", + "Explanation": "Explicación", + "Export": "Exportar", + "Export :name": "Exportar :name", + "Failed Dependency": "Dependencia fallida", + "File": "Archivo", + "Files": "Archivos", + "Forbidden": "Prohibido", + "Found": "Encontrado", + "Gateway Timeout": "Tiempo de espera de puerta de enlace", + "Go Home": "Ir a inicio", + "Go to page :page": "Ir a la página :page", + "Gone": "Recurso no disponible", + "Hello!": "¡Hola!", + "Hide": "Ocultar", + "Hide :name": "Ocultar :name", + "Home": "Inicio", + "HTTP Version Not Supported": "Versión HTTP no compatible", + "I'm a teapot": "Soy una tetera", + "If you did not create an account, no further action is required.": "Si no ha creado una cuenta, no se requiere ninguna acción adicional.", + "If you did not request a password reset, no further action is required.": "Si no ha solicitado el restablecimiento de contraseña, omita este mensaje de correo electrónico.", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si está teniendo problemas al hacer clic en el botón \":actionText\", copie y pegue la URL de abajo\nen su navegador web:", + "IM Used": "IM usado", + "Image": "Imagen", + "Impersonate": "Personificar", + "Impersonation": "Personificación", + "Import": "Importar", + "Import :name": "Importar :name", + "Insufficient Storage": "Espacio insuficiente", + "Internal Server Error": "Error interno del servidor", + "Introduction": "Introducción", + "Invalid filename.": "Nombre de archivo no válido.", + "Invalid JSON was returned from the route.": "Se devolvió un JSON no válido desde la ruta.", + "Invalid SSL Certificate": "Certificado SSL no válido", + "Length Required": "Longitud requerida", + "Like": "Me gusta", + "Load": "Cargar", + "Localize": "Localizar", + "Location": "Ubicación", + "Locked": "Bloqueado", + "Log In": "Iniciar sesión", + "Log Out": "Finalizar sesión", + "Login": "Iniciar sesión", + "Logout": "Finalizar sesión", + "Loop Detected": "Bucle detectado", + "Maintenance Mode": "Modo de mantenimiento", + "Method Not Allowed": "Método no permitido", + "Misdirected Request": "Solicitud mal dirigida", + "Moved Permanently": "Movido permanentemente", + "Multi-Status": "Multiestado", + "Multiple Choices": "Múltiples opciones", + "Network Authentication Required": "Se requiere autenticación de red", + "Network Connect Timeout Error": "Error de tiempo de espera de conexión de red", + "Network Read Timeout Error": "Error de tiempo de espera de lectura de red", + "New": "Nuevo", + "New :name": "Nuevo :name", + "No": "No", + "No Content": "Sin contenido", + "Non-Authoritative Information": "Información no autorizada", + "Not Acceptable": "Inaceptable", + "Not Extended": "no extendido", + "Not Found": "No encontrado", + "Not Implemented": "No se ha implementado", + "Not Modified": "No modificado", + "of": "de", + "OK": "Correcto", + "Open": "Abrir", + "Open in a current window": "Abrir en una ventana actual", + "Open in a new window": "Abrir en una ventana nueva", + "Open in a parent frame": "Abrir en un marco principal", + "Open in the topmost frame": "Abrir en el marco superior", + "Open on the website": "Abrir en el sitio web", + "Origin Is Unreachable": "El origen es inalcanzable", + "Page Expired": "Página expirada", + "Pagination Navigation": "Navegación por los enlaces de paginación", + "Partial Content": "Contenido parcial", + "Payload Too Large": "Solicitud demasiado grande", + "Payment Required": "Pago requerido", + "Permanent Redirect": "Redirección permanente", + "Please click the button below to verify your email address.": "Por favor, haga clic en el botón de abajo para verificar su dirección de correo electrónico.", + "Precondition Failed": "Error de condición previa", + "Precondition Required": "Precondición requerida", + "Preview": "Previsualizar", + "Price": "Precio", + "Processing": "Procesando", + "Proxy Authentication Required": "Se requiere autenticación proxy", + "Railgun Error": "Error de cañón de riel", + "Range Not Satisfiable": "Rango no satisfactorio", + "Record": "Registro", + "Regards,": "Saludos,", + "Register": "Registrarse", + "Request Header Fields Too Large": "Campos de encabezado de solicitud demasiado grandes", + "Request Timeout": "Solicitud de tiempo de espera", + "Reset Content": "Restablecer contenido", + "Reset Password": "Restablecer contraseña", + "Reset your password": "Restablezca su contraseña", + "Restore": "Restaurar", + "Restore :name": "Restaurar :name", + "results": "resultados", + "Retry With": "Reintentar con", + "Save": "Guardar", + "Save & Close": "Guardar y cerrar", + "Save & Return": "Guardar y volver", + "Save :name": "Guardar :name", + "Search": "Buscar", + "Search :name": "Buscar :name", + "See Other": "Ver otros", + "Select": "Seleccione", + "Select All": "Seleccionar todo", + "Send": "Enviar", + "Server Error": "Error del servidor", + "Service Unavailable": "Servicio no disponible", + "Session Has Expired": "La sesión ha expirado", + "Settings": "Ajustes", + "Show": "Mostrar", + "Show :name": "Mostrar :name", + "Show All": "Mostrar todo", + "Showing": "Mostrando", + "Sign In": "Iniciar sesión", + "Solve": "Resolver", + "SSL Handshake Failed": "Protocolo de enlace SSL fallido", + "Start": "Comenzar", + "Stop": "Detener", + "Submit": "Enviar", + "Subscribe": "Suscriba", + "Switch": "Cambiar", + "Switch To Role": "Cambiar de rol", + "Switching Protocols": "Protocolos de conmutación", + "Tag": "Etiqueta", + "Tags": "Etiquetas", + "Temporary Redirect": "Redirección temporal", + "The given data was invalid.": "Los datos proporcionados no son válidos.", + "The response is not a streamed response.": "La respuesta no es una respuesta transmitida.", + "The response is not a view.": "La respuesta no es una vista.", + "This action is unauthorized.": "Esta acción no está autorizada.", + "This password reset link will expire in :count minutes.": "Este enlace de restablecimiento de contraseña expirará en :count minutos.", + "to": "al", + "Toggle navigation": "Alternar navegación", + "Too Early": "Demasiado temprano", + "Too Many Requests": "Demasiadas peticiones", + "Translate": "Traducir", + "Translate It": "Traducirlo", + "Unauthorized": "No autorizado", + "Unavailable For Legal Reasons": "No disponible por razones legales", + "Unknown Error": "Error desconocido", + "Unpack": "Desglosar", + "Unprocessable Entity": "Entidad no procesable", + "Unsubscribe": "Darse de baja", + "Unsupported Media Type": "Tipo de medio no admitido", + "Up": "Arriba", + "Update": "Actualizar", + "Update :name": "Actualizar :name", + "Upgrade Required": "Se requiere actualización", + "URI Too Long": "URI demasiado largo", + "Use Proxy": "Usa proxy", + "User": "Usuario", + "Variant Also Negotiates": "Variante También Negocia", + "Verify Email Address": "Confirme su correo electrónico", + "Verify your email address": "Verifique su dirección de correo electrónico", + "View": "Ver", + "View :name": "Ver :name", + "Web Server is Down": "El servidor web está caído", + "Whoops!": "¡Ups!", + "Yes": "Sí", + "You are receiving this email because we received a password reset request for your account.": "Ha recibido este mensaje porque se solicitó un restablecimiento de contraseña para su cuenta." +} \ No newline at end of file diff --git a/lang/es/actions.php b/lang/es/actions.php new file mode 100644 index 0000000..f709ddf --- /dev/null +++ b/lang/es/actions.php @@ -0,0 +1,119 @@ + 'Aceptar', + 'action' => 'Acción', + 'actions' => 'Acciones', + 'add' => 'Agregar', + 'admin' => 'Administrar', + 'agree' => 'Aceptar', + 'archive' => 'Archivar', + 'assign' => 'Asignar', + 'associate' => 'Asociar', + 'attach' => 'Adjuntar', + 'browse' => 'Navegar', + 'cancel' => 'Cancelar', + 'choose' => 'Elegir', + 'choose_file' => 'Elegir archivo', + 'choose_image' => 'Elegir Imagen', + 'click_to_copy' => 'Haga clic para copiar', + 'close' => 'Cerrar', + 'collapse' => 'Colapsar', + 'collapse_all' => 'Colapsar todo', + 'comment' => 'Comentar', + 'confirm' => 'Confirmar', + 'connect' => 'Conectar', + 'create' => 'Crear', + 'delete' => 'Borrar', + 'detach' => 'Desasociar', + 'details' => 'Detalles', + 'disable' => 'Desactivar', + 'discard' => 'Descartar', + 'done' => 'Hecho', + 'down' => 'Abajo', + 'duplicate' => 'Duplicar', + 'edit' => 'Editar', + 'enable' => 'Permitir', + 'expand' => 'Expandir', + 'expand_all' => 'Expandir todo', + 'explanation' => 'Explicación', + 'export' => 'Exportar', + 'file' => 'Archivo', + 'files' => 'Archivos', + 'go_home' => 'Ir a Inicio', + 'hide' => 'Ocultar', + 'home' => 'Inicio', + 'image' => 'Imagen', + 'impersonate' => 'Personificar', + 'impersonation' => 'Personificación', + 'import' => 'Importar', + 'introduction' => 'Introducción', + 'like' => 'Me gusta', + 'load' => 'Cargar', + 'localize' => 'Localizar', + 'log_in' => 'Acceder', + 'log_out' => 'Cerrar sesión', + 'named' => [ + 'add' => 'Agregar :name', + 'choose' => 'Elegir :name', + 'create' => 'Crear :name', + 'delete' => 'Eliminar :name', + 'duplicate' => 'Duplicar :name', + 'edit' => 'Editar :name', + 'export' => 'Exportar :name', + 'hide' => 'Ocultar :name', + 'import' => 'Importar :name', + 'new' => 'Nuevo :name', + 'restore' => 'Restaurar :name', + 'save' => 'Guardar :name', + 'search' => 'Buscar :name', + 'show' => 'Mostrar :name', + 'update' => 'Actualizar :name', + 'view' => 'Ver :name', + ], + 'new' => 'Nuevo', + 'no' => 'No', + 'open' => 'Abrir', + 'open_website' => 'Abrir en el sitio web', + 'preview' => 'Previsualizar', + 'price' => 'Precio', + 'record' => 'Registro', + 'restore' => 'Restaurar', + 'save' => 'Guardar', + 'save_and_close' => 'Guardar y cerrar', + 'save_and_return' => 'Guardar y volver', + 'search' => 'Buscar', + 'select' => 'Seleccionar', + 'select_all' => 'Seleccionar todo', + 'send' => 'Enviar', + 'settings' => 'Ajustes', + 'show' => 'Mostrar', + 'show_all' => 'Mostrar todo', + 'sign_in' => 'Iniciar sesión', + 'solve' => 'Resolver', + 'start' => 'Comenzar', + 'stop' => 'Detener', + 'submit' => 'Enviar', + 'subscribe' => 'Suscribir', + 'switch' => 'Cambiar', + 'switch_to_role' => 'Cambiar de rol', + 'tag' => 'Etiqueta', + 'tags' => 'Etiquetas', + 'target_link' => [ + 'blank' => 'Abrir en una ventana nueva', + 'parent' => 'Abrir en el marco principal', + 'self' => 'Abrir en la ventana actual', + 'top' => 'Abrir en el marco superior', + ], + 'translate' => 'Traducir', + 'translate_it' => 'Traducirlo', + 'unpack' => 'Desglosar', + 'unsubscribe' => 'Darse de baja', + 'up' => 'Arriba', + 'update' => 'Actualizar', + 'user' => 'Usuario', + 'view' => 'Ver', + 'yes' => 'Sí', +]; diff --git a/lang/es/auth.php b/lang/es/auth.php new file mode 100644 index 0000000..888279b --- /dev/null +++ b/lang/es/auth.php @@ -0,0 +1,9 @@ + 'Estas credenciales no coinciden con nuestros registros.', + 'password' => 'La contraseña es incorrecta.', + 'throttle' => 'Demasiados intentos de acceso. Por favor intente nuevamente en :seconds segundos.', +]; diff --git a/lang/es/http-statuses.php b/lang/es/http-statuses.php new file mode 100644 index 0000000..0548dab --- /dev/null +++ b/lang/es/http-statuses.php @@ -0,0 +1,84 @@ + 'Error desconocido', + '100' => 'Continuar', + '101' => 'Protocolos de conmutación', + '102' => 'Procesando', + '200' => 'DE ACUERDO', + '201' => 'Creado', + '202' => 'Aceptado', + '203' => 'Información no autorizada', + '204' => 'Sin contenido', + '205' => 'Restablecer contenido', + '206' => 'Contenido parcial', + '207' => 'Multiestado', + '208' => 'Ya Reportado', + '226' => 'IM usado', + '300' => 'Múltiples opciones', + '301' => 'Movido permanentemente', + '302' => 'Encontrado', + '303' => 'Ver otros', + '304' => 'No modificado', + '305' => 'Usa proxy', + '307' => 'Redirección temporal', + '308' => 'Redirección permanente', + '400' => 'Solicitud incorrecta', + '401' => 'No autorizado', + '402' => 'Pago requerido', + '403' => 'Prohibido', + '404' => 'No encontrado', + '405' => 'Método no permitido', + '406' => 'Inaceptable', + '407' => 'Se requiere autenticación proxy', + '408' => 'Solicitud de tiempo de espera', + '409' => 'Conflicto', + '410' => 'Recurso no disponible', + '411' => 'Longitud requerida', + '412' => 'Error de condición previa', + '413' => 'Solicitud demasiado grande', + '414' => 'URI demasiado largo', + '415' => 'Tipo de medio no admitido', + '416' => 'Rango no satisfactorio', + '417' => 'Expectativa fallida', + '418' => 'Soy una tetera', + '419' => 'La sesión ha expirado', + '421' => 'Solicitud mal dirigida', + '422' => 'Entidad no procesable', + '423' => 'Bloqueado', + '424' => 'Dependencia fallida', + '425' => 'Demasiado temprano', + '426' => 'Se requiere actualización', + '428' => 'Precondición requerida', + '429' => 'Demasiadas solicitudes', + '431' => 'Campos de encabezado de solicitud demasiado grandes', + '444' => 'Conexión cerrada sin respuesta', + '449' => 'Reintentar con', + '451' => 'No disponible por razones legales', + '499' => 'Solicitud cerrada del cliente', + '500' => 'Error interno del servidor', + '501' => 'No se ha implementado', + '502' => 'Mala puerta de enlace', + '503' => 'Modo de mantenimiento', + '504' => 'Tiempo de espera de puerta de enlace', + '505' => 'Versión HTTP no compatible', + '506' => 'Variante También Negocia', + '507' => 'Espacio insuficiente', + '508' => 'Bucle detectado', + '509' => 'Límite de ancho de banda excedido', + '510' => 'no extendido', + '511' => 'Se requiere autenticación de red', + '520' => 'Error desconocido', + '521' => 'El servidor web está caído', + '522' => 'Tiempo de conexión agotado', + '523' => 'El origen es inalcanzable', + '524' => 'Se produjo un tiempo de espera', + '525' => 'Protocolo de enlace SSL fallido', + '526' => 'Certificado SSL no válido', + '527' => 'Error de cañón de riel', + '598' => 'Error de tiempo de espera de lectura de red', + '599' => 'Error de tiempo de espera de conexión de red', + 'unknownError' => 'Error desconocido', +]; diff --git a/lang/es/messages.php b/lang/es/messages.php new file mode 100644 index 0000000..e6e1c88 --- /dev/null +++ b/lang/es/messages.php @@ -0,0 +1,13 @@ + 'Credenciales inválidas.', + 'account_deactivated' => 'Esta cuenta está desactivada.', + 'account_pending_approval' => 'Tu cuenta está pendiente de aprobación por un administrador.', + 'registration_pending' => 'Cuenta creada. Un administrador tiene que aprobarla antes de que puedas ingresar.', + 'cannot_remove_own_admin_role' => 'No podés quitarte el rol de admin a vos mismo.', + 'cannot_delete_self' => 'No podés borrar tu propia cuenta.', + 'cannot_delete_last_admin' => 'No podés borrar al último administrador.', + 'self_service_requires_user' => 'Este recurso es self-service: necesita un token con usuario asociado (no funciona con client_credentials).', + 'user_not_trashed' => 'Este usuario no está en la papelera.', +]; diff --git a/lang/es/pagination.php b/lang/es/pagination.php new file mode 100644 index 0000000..03816a3 --- /dev/null +++ b/lang/es/pagination.php @@ -0,0 +1,8 @@ + 'Siguiente »', + 'previous' => '« Anterior', +]; diff --git a/lang/es/passwords.php b/lang/es/passwords.php new file mode 100644 index 0000000..75b5e89 --- /dev/null +++ b/lang/es/passwords.php @@ -0,0 +1,11 @@ + 'Su contraseña ha sido restablecida.', + 'sent' => 'Le hemos enviado por correo electrónico el enlace para restablecer su contraseña.', + 'throttled' => 'Por favor espere antes de intentar de nuevo.', + 'token' => 'El token de restablecimiento de contraseña es inválido.', + 'user' => 'No encontramos ningún usuario con ese correo electrónico.', +]; diff --git a/lang/es/validation.php b/lang/es/validation.php new file mode 100644 index 0000000..99fef7f --- /dev/null +++ b/lang/es/validation.php @@ -0,0 +1,289 @@ + 'El campo :attribute debe ser aceptado.', + 'accepted_if' => 'El campo :attribute debe ser aceptado cuando :other sea :value.', + 'active_url' => 'El campo :attribute debe ser una URL válida.', + 'after' => 'El campo :attribute debe ser una fecha posterior a :date.', + 'after_or_equal' => 'El campo :attribute debe ser una fecha posterior o igual a :date.', + 'alpha' => 'El campo :attribute sólo debe contener letras.', + 'alpha_dash' => 'El campo :attribute sólo debe contener letras, números, guiones y guiones bajos.', + 'alpha_num' => 'El campo :attribute sólo debe contener letras y números.', + 'any_of' => 'El campo :attribute no es válido.', + 'array' => 'El campo :attribute debe ser un conjunto.', + 'ascii' => 'El campo :attribute solo debe contener caracteres alfanuméricos y símbolos de un solo byte.', + 'base64' => 'The :attribute field must be a valid Base64 string.', + 'before' => 'El campo :attribute debe ser una fecha anterior a :date.', + 'before_or_equal' => 'El campo :attribute debe ser una fecha anterior o igual a :date.', + 'between' => [ + 'array' => 'El campo :attribute tiene que tener entre :min - :max elementos.', + 'file' => 'El campo :attribute debe pesar entre :min - :max kilobytes.', + 'numeric' => 'El campo :attribute tiene que estar entre :min - :max.', + 'string' => 'El campo :attribute tiene que tener entre :min - :max caracteres.', + ], + 'boolean' => 'El campo :attribute debe tener un valor verdadero o falso.', + 'can' => 'El campo :attribute contiene un valor no autorizado.', + 'confirmed' => 'La confirmación de :attribute no coincide.', + 'contains' => 'Al campo :attribute le falta un valor obligatorio.', + 'current_password' => 'La contraseña es incorrecta.', + 'date' => 'El campo :attribute debe ser una fecha válida.', + 'date_equals' => 'El campo :attribute debe ser una fecha igual a :date.', + 'date_format' => 'El campo :attribute debe coincidir con el formato :format.', + 'decimal' => 'El campo :attribute debe tener :decimal cifras decimales.', + 'declined' => 'El campo :attribute debe ser rechazado.', + 'declined_if' => 'El campo :attribute debe ser rechazado cuando :other sea :value.', + 'different' => 'El campo :attribute y :other deben ser diferentes.', + 'digits' => 'El campo :attribute debe tener :digits dígitos.', + 'digits_between' => 'El campo :attribute debe tener entre :min y :max dígitos.', + 'dimensions' => 'El campo :attribute tiene dimensiones de imagen no válidas.', + 'distinct' => 'El campo :attribute contiene un valor duplicado.', + 'doesnt_contain' => 'El campo :attribute no debe contener ninguno de los siguientes valores: :values.', + 'doesnt_end_with' => 'El campo :attribute no debe finalizar con uno de los siguientes: :values.', + 'doesnt_start_with' => 'El campo :attribute no debe comenzar con uno de los siguientes: :values.', + 'email' => 'El campo :attribute no es un correo válido.', + 'encoding' => 'El campo :attribute debe estar codificado en :encoding.', + 'ends_with' => 'El campo :attribute debe finalizar con uno de los siguientes valores: :values', + 'enum' => 'El campo :attribute no está en la lista de valores permitidos.', + 'exists' => 'El campo :attribute no existe.', + 'extensions' => 'El campo :attribute debe tener una de las siguientes extensiones: :values.', + 'file' => 'El campo :attribute debe ser un archivo.', + 'filled' => 'El campo :attribute es obligatorio.', + 'gt' => [ + 'array' => 'El campo :attribute debe tener más de :value elementos.', + 'file' => 'El campo :attribute debe tener más de :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser mayor que :value.', + 'string' => 'El campo :attribute debe tener más de :value caracteres.', + ], + 'gte' => [ + 'array' => 'El campo :attribute debe tener como mínimo :value elementos.', + 'file' => 'El campo :attribute debe tener como mínimo :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser como mínimo :value.', + 'string' => 'El campo :attribute debe tener como mínimo :value caracteres.', + ], + 'hex_color' => 'El campo :attribute debe tener un color hexadecimal válido.', + 'image' => 'El campo :attribute debe ser una imagen.', + 'in' => 'El campo :attribute no está en la lista de valores permitidos.', + 'in_array' => 'El campo :attribute debe existir en :other.', + 'in_array_keys' => 'El campo :attribute debe contener al menos una de las siguientes claves: :values.', + 'integer' => 'El campo :attribute debe ser un número entero.', + 'ip' => 'El campo :attribute debe ser una dirección IP válida.', + 'ipv4' => 'El campo :attribute debe ser una dirección IPv4 válida.', + 'ipv6' => 'El campo :attribute debe ser una dirección IPv6 válida.', + 'json' => 'El campo :attribute debe ser una cadena JSON válida.', + 'list' => 'El campo :attribute debe ser una lista.', + 'lowercase' => 'El campo :attribute debe estar en minúscula.', + 'lt' => [ + 'array' => 'El campo :attribute debe tener menos de :value elementos.', + 'file' => 'El campo :attribute debe tener menos de :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser menor que :value.', + 'string' => 'El campo :attribute debe tener menos de :value caracteres.', + ], + 'lte' => [ + 'array' => 'El campo :attribute debe tener como máximo :value elementos.', + 'file' => 'El campo :attribute debe tener como máximo :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser como máximo :value.', + 'string' => 'El campo :attribute debe tener como máximo :value caracteres.', + ], + 'mac_address' => 'El campo :attribute debe ser una dirección MAC válida.', + 'max' => [ + 'array' => 'El campo :attribute no debe tener más de :max elementos.', + 'file' => 'El campo :attribute no debe ser mayor que :max kilobytes.', + 'numeric' => 'El campo :attribute no debe ser mayor que :max.', + 'string' => 'El campo :attribute no debe ser mayor que :max caracteres.', + ], + 'max_digits' => 'El campo :attribute no debe tener más de :max dígitos.', + 'mimes' => 'El campo :attribute debe ser un archivo con formato: :values.', + 'mimetypes' => 'El campo :attribute debe ser un archivo con formato: :values.', + 'min' => [ + 'array' => 'El campo :attribute debe tener al menos :min elementos.', + 'file' => 'El tamaño de :attribute debe ser de al menos :min kilobytes.', + 'numeric' => 'El tamaño de :attribute debe ser de al menos :min.', + 'string' => 'El campo :attribute debe contener al menos :min caracteres.', + ], + 'min_digits' => 'El campo :attribute debe tener al menos :min dígitos.', + 'missing' => 'El campo :attribute no debe estar presente.', + 'missing_if' => 'El campo :attribute no debe estar presente cuando :other sea :value.', + 'missing_unless' => 'El campo :attribute no debe estar presente a menos que :other sea :value.', + 'missing_with' => 'El campo :attribute no debe estar presente si alguno de los campos :values está presente.', + 'missing_with_all' => 'El campo :attribute no debe estar presente cuando los campos :values estén presentes.', + 'multiple_of' => 'El campo :attribute debe ser múltiplo de :value', + 'not_in' => 'El campo :attribute no debe estar en la lista.', + 'not_regex' => 'El formato del campo :attribute no es válido.', + 'numeric' => 'El campo :attribute debe ser numérico.', + 'password' => [ + 'letters' => 'La :attribute debe contener al menos una letra.', + 'mixed' => 'La :attribute debe contener al menos una letra mayúscula y una minúscula.', + 'numbers' => 'La :attribute debe contener al menos un número.', + 'symbols' => 'La :attribute debe contener al menos un símbolo.', + 'uncompromised' => 'La :attribute proporcionada se ha visto comprometida en una filtración de datos (data leak). Elija una :attribute diferente.', + ], + 'present' => 'El campo :attribute debe estar presente.', + 'present_if' => 'El campo :attribute debe estar presente cuando :other es :value.', + 'present_unless' => 'El campo :attribute debe estar presente a menos que :other sea :value.', + 'present_with' => 'El campo :attribute debe estar presente cuando :values esté presente.', + 'present_with_all' => 'El campo :attribute debe estar presente cuando :values estén presentes.', + 'prohibited' => 'El campo :attribute está prohibido.', + 'prohibited_if' => 'El campo :attribute está prohibido cuando :other es :value.', + 'prohibited_if_accepted' => 'El campo :attribute está prohibido cuando se acepta :other.', + 'prohibited_if_declined' => 'El campo :attribute está prohibido cuando se rechaza :other.', + 'prohibited_unless' => 'El campo :attribute está prohibido a menos que :other sea :values.', + 'prohibits' => 'El campo :attribute prohibe que :other esté presente.', + 'regex' => 'El formato del campo :attribute no es válido.', + 'required' => 'El campo :attribute es obligatorio.', + 'required_array_keys' => 'El campo :attribute debe contener entradas para: :values.', + 'required_if' => 'El campo :attribute es obligatorio cuando :other es :value.', + 'required_if_accepted' => 'El campo :attribute es obligatorio si :other es aceptado.', + 'required_if_declined' => 'El campo :attribute es obligatorio si :other es rechazado.', + 'required_unless' => 'El campo :attribute es obligatorio a menos que :other esté en :values.', + 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.', + 'required_with_all' => 'El campo :attribute es obligatorio cuando :values están presentes.', + 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.', + 'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de :values está presente.', + 'same' => 'Los campos :attribute y :other deben coincidir.', + 'size' => [ + 'array' => 'El campo :attribute debe contener :size elementos.', + 'file' => 'El tamaño de :attribute debe ser :size kilobytes.', + 'numeric' => 'El tamaño de :attribute debe ser :size.', + 'string' => 'El campo :attribute debe contener :size caracteres.', + ], + 'starts_with' => 'El campo :attribute debe comenzar con uno de los siguientes valores: :values', + 'string' => 'El campo :attribute debe ser una cadena de caracteres.', + 'timezone' => 'El campo :attribute debe ser una zona horaria válida.', + 'ulid' => 'El campo :attribute debe ser un ULID válido.', + 'unique' => 'El campo :attribute ya ha sido registrado.', + 'uploaded' => 'Subir :attribute ha fallado.', + 'uppercase' => 'El campo :attribute debe estar en mayúscula.', + 'url' => 'El campo :attribute debe ser una URL válida.', + 'uuid' => 'El campo :attribute debe ser un UUID válido.', + 'attributes' => [ + 'address' => 'dirección', + 'affiliate_url' => 'URL de afiliado', + 'age' => 'edad', + 'amount' => 'cantidad', + 'announcement' => 'anuncio', + 'area' => 'área', + 'audience_prize' => 'premio del público', + 'audience_winner' => 'ganador del público', + 'available' => 'disponible', + 'birthday' => 'cumpleaños', + 'body' => 'contenido', + 'city' => 'ciudad', + 'color' => 'color', + 'company' => 'compañía', + 'compilation' => 'compilación', + 'concept' => 'concepto', + 'conditions' => 'condiciones', + 'content' => 'contenido', + 'contest' => 'concurso', + 'country' => 'país', + 'cover' => 'portada', + 'created_at' => 'creado el', + 'creator' => 'creador', + 'currency' => 'moneda', + 'current_password' => 'contraseña actual', + 'customer' => 'cliente', + 'date' => 'fecha', + 'date_of_birth' => 'fecha de nacimiento', + 'dates' => 'fechas', + 'day' => 'día', + 'deleted_at' => 'eliminado el', + 'description' => 'descripción', + 'display_type' => 'tipo de visualización', + 'district' => 'distrito', + 'duration' => 'duración', + 'email' => 'correo electrónico', + 'excerpt' => 'extracto', + 'filter' => 'filtro', + 'finished_at' => 'terminado el', + 'first_name' => 'nombre', + 'gender' => 'género', + 'grand_prize' => 'gran Premio', + 'group' => 'grupo', + 'hour' => 'hora', + 'image' => 'imagen', + 'image_desktop' => 'imagen de escritorio', + 'image_main' => 'imagen principal', + 'image_mobile' => 'imagen móvil', + 'images' => 'imágenes', + 'is_audience_winner' => 'es ganador de audiencia', + 'is_hidden' => 'está oculto', + 'is_subscribed' => 'está suscrito', + 'is_visible' => 'es visible', + 'is_winner' => 'es ganador', + 'items' => 'elementos', + 'key' => 'clave', + 'last_name' => 'apellidos', + 'lesson' => 'lección', + 'line_address_1' => 'línea de dirección 1', + 'line_address_2' => 'línea de dirección 2', + 'login' => 'acceso', + 'message' => 'mensaje', + 'middle_name' => 'segundo nombre', + 'minute' => 'minuto', + 'mobile' => 'móvil', + 'month' => 'mes', + 'name' => 'nombre', + 'national_code' => 'código nacional', + 'number' => 'número', + 'password' => 'contraseña', + 'password_confirmation' => 'confirmación de la contraseña', + 'phone' => 'teléfono', + 'photo' => 'foto', + 'portfolio' => 'portafolio', + 'postal_code' => 'código postal', + 'preview' => 'vista preliminar', + 'price' => 'precio', + 'product_id' => 'ID del producto', + 'product_uid' => 'UID del producto', + 'product_uuid' => 'UUID del producto', + 'promo_code' => 'código promocional', + 'province' => 'provincia', + 'quantity' => 'cantidad', + 'reason' => 'razón', + 'recaptcha_response_field' => 'respuesta del recaptcha', + 'referee' => 'árbitro', + 'referees' => 'árbitros', + 'region' => 'región', + 'reject_reason' => 'motivo de rechazo', + 'remember' => 'recordar', + 'restored_at' => 'restaurado el', + 'result_text_under_image' => 'texto bajo la imagen', + 'role' => 'rol', + 'rule' => 'regla', + 'rules' => 'reglas', + 'second' => 'segundo', + 'sex' => 'sexo', + 'shipment' => 'envío', + 'short_text' => 'texto corto', + 'size' => 'tamaño', + 'skills' => 'habilidades', + 'slug' => 'slug', + 'specialization' => 'especialización', + 'started_at' => 'comenzado el', + 'state' => 'estado', + 'status' => 'estado', + 'street' => 'calle', + 'student' => 'estudiante', + 'subject' => 'asunto', + 'tag' => 'etiqueta', + 'tags' => 'etiquetas', + 'teacher' => 'profesor', + 'terms' => 'términos', + 'test_description' => 'descripción de prueba', + 'test_locale' => 'idioma de prueba', + 'test_name' => 'nombre de prueba', + 'text' => 'texto', + 'time' => 'hora', + 'title' => 'título', + 'type' => 'tipo', + 'updated_at' => 'actualizado el', + 'user' => 'usuario', + 'username' => 'usuario', + 'value' => 'valor', + 'winner' => 'ganador', + 'work' => 'trabajo', + 'year' => 'año', + ], +]; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9e50a9f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2944 @@ +{ + "name": "oauth", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "axios": "^1.18.1", + "pinia": "^4.0.2", + "vue": "^3.5.40", + "vue-i18n": "^11.4.7", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@types/node": "^26.1.1", + "@vitejs/plugin-vue": "^6.0.8", + "@vue/tsconfig": "^0.9.1", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^3.1", + "sass": "^1.102.0", + "typescript": "^6.0.3", + "vite": "^8.0.0", + "vue-tsc": "^3.3.8" + } + }, + "node_modules/@babel/generator": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", + "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/helper-string-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/parser": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@intlify/core-base": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.4.7.tgz", + "integrity": "sha512-MSB/sBKwEWJTILvQIhg2rnIcwPpLayo3wGwvVA+dJTNeUBD9GoqQgAaSOLdI9iOPDHCm9YoVnLqpfzza98MpkQ==", + "license": "MIT", + "dependencies": { + "@intlify/devtools-types": "11.4.7", + "@intlify/message-compiler": "11.4.7", + "@intlify/shared": "11.4.7" + }, + "engines": { + "node": ">= 22" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/devtools-types": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/@intlify/devtools-types/-/devtools-types-11.4.7.tgz", + "integrity": "sha512-GSz+J+hqH+AEpAHIYya6fSufS30OaMnG39HiZX7DmGKi3+aaLvassCfsXENEc4Wr4m68q2YP0QdMdB3D9UeAXg==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.4.7", + "@intlify/shared": "11.4.7" + }, + "engines": { + "node": ">= 22" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.4.7.tgz", + "integrity": "sha512-bHxmh7n94N4N1evADeb7XTkc3jTw6Ki5biMFZVSX6Jmk+iehy8/maeH2XUsBI27rtKIK+Hzc6QnVAKggUwylKw==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "11.4.7", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 22" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.4.7.tgz", + "integrity": "sha512-OtjPZan3No2OZZFnMUiCVsXC6+j+XRwEywaFDk0AoayAbLuPesyDloXhJZLl9JUl5vHZeQUkYSbEA8VX+CWMjg==", + "license": "MIT", + "engines": { + "node": ">= 22" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "devOptional": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", + "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz", + "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz", + "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.40", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz", + "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz", + "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.40", + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-ssr": "3.5.40", + "@vue/shared": "3.5.40", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz", + "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.5.tgz", + "integrity": "sha512-YJipMVAKe5wT5CWf5kTYCaNV7NMNjFVxJkIkJaJ4W/nCxEBzlZzrOsYKeCymdCrFZmBS/+wTWFoUs3Jf/Q6XSQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.5" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.5.tgz", + "integrity": "sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.5.tgz", + "integrity": "sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.8.tgz", + "integrity": "sha512-ieGT8jJdhhy0mGzStZhsg/qPw5bQZJg5yF+3+XU6saf4sM7yo9ZXy3h+nCwrm2+b4qS/SypkNdR2jAF3uei9tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.2.1", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.4" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz", + "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz", + "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz", + "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/runtime-core": "3.5.40", + "@vue/shared": "3.5.40", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz", + "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz", + "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.9.1.tgz", + "integrity": "sha512-buvjm+9NzLCJL29KY1j1991YYJ5e6275OiK+G4jtmfIb+z4POywbdm0wXusT9adVWqe0xqg70TbI7+mRx4uU9w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 5.8", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/alien-signals": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz", + "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", + "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@babel/types": "^7.29.0", + "ast-kit": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concurrently": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", + "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.9.0", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", + "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-3.1.3.tgz", + "integrity": "sha512-cI5Anw4QHY+UzvZczFaj+j8NhwT2FtyEN8aqS/hOdt6DpEFBsn6x3GENxALem3cc+TsGvd9MacneimEvShvKMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "tinyglobby": "^0.2.12", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "fontaine": "^0.8.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "fontaine": { + "optional": true + } + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "devOptional": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nostics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nostics/-/nostics-1.2.0.tgz", + "integrity": "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==", + "license": "MIT" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-4.0.2.tgz", + "integrity": "sha512-yKVVA7bSj5oRZFp/Ab9wLlmyb5gPUYEiIm4ryiWTe/xe7PtkRdMVOp1X1ggvq0c6Uj7Q0Du1HnV2mtAwM0Ks1g==", + "license": "MIT", + "dependencies": { + "nostics": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/devtools-api": "^8.1.5", + "typescript": ">=5.6.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "@vue/devtools-api": { + "optional": false + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sass": { + "version": "1.102.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.102.0.tgz", + "integrity": "sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", + "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.4", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@farmfe/core": "*", + "@rspack/core": "*", + "bun-types-no-globals": "*", + "esbuild": "*", + "rolldown": "*", + "rollup": "*", + "unloader": "*", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@farmfe/core": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "bun-types-no-globals": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "unloader": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/vite": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz", + "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-sfc": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/server-renderer": "3.5.40", + "@vue/shared": "3.5.40" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.4.7.tgz", + "integrity": "sha512-j6RyshdPPzqLiMAUpnpvZGFPM+rRoWi14Sl5yTsquvoW0/56DWyvhAj2o9TO2YXGvb6teg8T0xrYO9jR3urvdw==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.4.7", + "@intlify/devtools-types": "11.4.7", + "@intlify/shared": "11.4.7", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 22" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-i18n/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.2.0.tgz", + "integrity": "sha512-QAC5i0LEb1GLG0LXDQmHu8L7FX12j0KwU/JTKmLQUJMrn04gQdKP6Du+p0QwpHb3iy71vBlqnHQ8WAfOSAWhqw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^8.0.0", + "@vue-macros/common": "^3.1.3", + "@vue/devtools-api": "^8.1.5", + "ast-walker-scope": "^0.9.0", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.2.1", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "muggle-string": "^0.4.1", + "nostics": "^1.1.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.5", + "scule": "^1.3.0", + "tinyglobby": "^0.2.17", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2", + "yaml": "^2.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.34 || ^4.0.0", + "pinia": "^3.0.4 || ^4.0.2", + "vite": "^7.3.0 || ^8.0.0", + "vue": "^3.5.34 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.8.tgz", + "integrity": "sha512-xXmYlVQpcwJDWyGlqbHrGVOl1h3UOsASymRibrHc+iy9j/UNnOrOn4u+fntHz4D6Cs74RtapeqVV6CzJeg+UlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.3.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0b5cbf0 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://www.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite", + "type-check": "vue-tsc --noEmit" + }, + "devDependencies": { + "@types/node": "^26.1.1", + "@vitejs/plugin-vue": "^6.0.8", + "@vue/tsconfig": "^0.9.1", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^3.1", + "sass": "^1.102.0", + "typescript": "^6.0.3", + "vite": "^8.0.0", + "vue-tsc": "^3.3.8" + }, + "dependencies": { + "axios": "^1.18.1", + "pinia": "^4.0.2", + "vue": "^3.5.40", + "vue-i18n": "^11.4.7", + "vue-router": "^5.2.0" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..e7f0a48 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,36 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..ee8f07e --- /dev/null +++ b/public/index.php @@ -0,0 +1,20 @@ +handleRequest(Request::capture()); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/js/App.vue b/resources/js/App.vue new file mode 100644 index 0000000..97c432c --- /dev/null +++ b/resources/js/App.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/resources/js/app.ts b/resources/js/app.ts new file mode 100644 index 0000000..41c71d6 --- /dev/null +++ b/resources/js/app.ts @@ -0,0 +1,13 @@ +import './bootstrap'; + +import { createApp } from 'vue'; +import { createPinia } from 'pinia'; +import App from './App.vue'; +import router from './router'; +import i18n from './i18n'; + +createApp(App) + .use(createPinia()) + .use(router) + .use(i18n) + .mount('#app'); diff --git a/resources/js/bootstrap.ts b/resources/js/bootstrap.ts new file mode 100644 index 0000000..8e9d770 --- /dev/null +++ b/resources/js/bootstrap.ts @@ -0,0 +1,13 @@ +import axios from 'axios'; + +declare global { + interface Window { + axios: typeof axios; + } +} + +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; +window.axios.defaults.withCredentials = true; +window.axios.defaults.withXSRFToken = true; diff --git a/resources/js/components/charts/BarList.vue b/resources/js/components/charts/BarList.vue new file mode 100644 index 0000000..9a9a6e7 --- /dev/null +++ b/resources/js/components/charts/BarList.vue @@ -0,0 +1,45 @@ + + + diff --git a/resources/js/components/charts/DailyLoginsChart.vue b/resources/js/components/charts/DailyLoginsChart.vue new file mode 100644 index 0000000..f6d5003 --- /dev/null +++ b/resources/js/components/charts/DailyLoginsChart.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/resources/js/components/charts/StatTile.vue b/resources/js/components/charts/StatTile.vue new file mode 100644 index 0000000..ad2ee6c --- /dev/null +++ b/resources/js/components/charts/StatTile.vue @@ -0,0 +1,15 @@ + + + diff --git a/resources/js/composables/useTheme.ts b/resources/js/composables/useTheme.ts new file mode 100644 index 0000000..8b41a3c --- /dev/null +++ b/resources/js/composables/useTheme.ts @@ -0,0 +1,16 @@ +import { ref } from 'vue'; + +// El estado inicial ya lo aplicó el script inline en app.blade.php (evita el +// flash); acá solo reflejamos esa clase para que el ícono del toggle arranque +// sincronizado. +const isDark = ref(document.documentElement.classList.contains('dark')); + +function toggleTheme(): void { + isDark.value = !isDark.value; + document.documentElement.classList.toggle('dark', isDark.value); + localStorage.setItem('theme', isDark.value ? 'dark' : 'light'); +} + +export function useTheme() { + return { isDark, toggleTheme }; +} diff --git a/resources/js/i18n/ca.ts b/resources/js/i18n/ca.ts new file mode 100644 index 0000000..ffb955b --- /dev/null +++ b/resources/js/i18n/ca.ts @@ -0,0 +1,209 @@ +import type { MessageSchema } from './es'; + +const ca: MessageSchema = { + nav: { + dashboard: 'Tauler', + clients: 'Clients OAuth', + tokens: 'Personal Access Tokens', + authorizedApps: 'Apps autoritzades', + users: 'Usuaris', + analytics: 'Analítiques', + apiDocs: 'API Docs', + logout: 'Sortir', + }, + common: { + loading: 'Carregant…', + creating: 'Creant…', + create: 'Crear', + save: 'Desar', + cancel: 'Cancel·lar', + close: 'Tancar', + edit: 'Editar', + delete: 'Esborrar', + none: '(cap)', + }, + login: { + title: 'Entrar', + subtitle: "Servidor OAuth2 — tauler d'administració.", + email: 'Email', + password: 'Contrasenya', + submit: 'Entrar', + submitting: 'Entrant…', + noAccount: 'No tens compte?', + signUp: "Registra't", + invalidCredentials: 'Credencials no vàlides.', + }, + register: { + title: 'Crear compte', + name: 'Nom', + email: 'Email', + password: 'Contrasenya', + passwordConfirm: 'Confirmar contrasenya', + submit: 'Crear compte', + submitFirstUser: 'Crear compte d\'administrador', + submitting: 'Creant…', + haveAccount: 'Ja tens compte?', + signIn: 'Entra', + firstUserBanner: 'Encara no hi ha cap usuari. Aquest compte quedarà com a administrador, amb accés immediat (sense aprovació).', + pendingTitle: 'Compte creat', + pendingBody: "Un administrador ha d'aprovar el teu compte abans que puguis entrar. És possible que t'avisin fora de l'app quan estigui llest.", + backToLogin: 'Tornar a entrar', + }, + dashboard: { + greeting: 'Hola, {name}', + subtitle: "Aquest és el tauler d'administració del servidor OAuth2.", + clientsTitle: 'Clients OAuth', + clientsDesc: 'Registra apps (Authorization Code+PKCE, Client Credentials o Password Grant).', + tokensTitle: 'Personal Access Tokens', + tokensDesc: "Genera tokens d'accés directe a l'API, com API keys.", + appsTitle: 'Apps autoritzades', + appsDesc: 'Apps de tercers a les quals has donat accés al teu compte.', + usersTitle: 'Usuaris', + usersDesc: 'Alta, edició de rol/estat i baixa de comptes (només admins).', + analyticsTitle: 'Analítiques', + analyticsDesc: 'Sessions actives, logins per app i usuaris més actius (només admins).', + apiTitle: 'API REST', + apiDesc: 'Aquest servidor exposa el recurs {resource} (scopes {read}/{write}) perquè aplicacions de tercers gestionin usuaris via OAuth2. Requereix un access token de Passport. Documentació interactiva a {link}.', + }, + clients: { + title: 'Clients OAuth', + subtitle: 'Apps registrades que poden demanar tokens a aquest servidor.', + secretWarning: 'Desa aquest client secret ara, no el podràs tornar a veure:', + clientIdLabel: 'client_id:', + clientSecretLabel: 'client_secret:', + newClient: 'Nou client', + name: 'Nom', + grantType: 'Grant type', + grantAuthCode: 'Authorization Code + PKCE', + grantClientCredentials: 'Client Credentials', + grantPassword: 'Password Grant', + redirectUris: 'Redirect URIs (separades per coma)', + confidentialLabel: "Client confidencial (amb secret). Desmarca-ho per a un client públic que només faci servir PKCE.", + create: 'Crear client', + empty: 'Encara no has creat cap client.', + revoke: 'Revocar', + revokeConfirm: 'Vols revocar el client "{name}"? Els seus tokens deixaran de funcionar.', + clientIdShort: 'client_id', + redirectLabel: 'redirect', + }, + tokens: { + title: 'Personal Access Tokens', + subtitle: "Tokens d'accés directe a l'API, sense passar pel flux d'authorize (tipus API key).", + tokenWarning: 'Desa aquest token ara, no el podràs tornar a veure:', + newToken: 'Nou token', + name: 'Nom', + namePlaceholder: 'El meu script', + scopes: 'Scopes', + create: 'Crear token', + empty: 'Encara no has creat cap token.', + revoke: 'Revocar', + revokeConfirm: 'Vols revocar el token "{name}"?', + scopesLabel: 'scopes', + }, + authorizedApps: { + title: 'Apps autoritzades', + subtitle: 'Aplicacions de tercers a les quals has donat accés al teu compte.', + empty: 'Encara no has autoritzat cap app.', + revoke: 'Revocar accés', + revokeConfirm: "Vols revocar l'accés de \"{name}\"?", + scopesLabel: 'scopes', + }, + authorize: { + title: 'Autoritzar aplicació', + wantsAccess: '{client} vol accedir al teu compte ({email}) amb els següents permisos:', + noScopes: "No sol·licita permisos addicionals (accés bàsic).", + approve: 'Autoritzar', + cancel: 'Cancel·lar', + notFoundTitle: 'Sol·licitud no trobada', + notFoundBody: "Aquesta pantalla només funciona quan hi arribes redirigit per una aplicació client via {path}. Torna-ho a provar des d'aquella app.", + goDashboard: 'Anar al tauler', + }, + adminUsers: { + title: 'Usuaris', + subtitle: 'Alta, edició de rol/estat i baixa de comptes.', + newUser: 'Nou usuari', + name: 'Nom', + email: 'Email', + password: 'Contrasenya', + role: 'Rol', + roleUser: 'Usuari', + roleAdmin: 'Admin', + create: 'Crear usuari', + colName: 'Nom', + colEmail: 'Email', + colRole: 'Rol', + colStatus: 'Estat', + active: 'Actiu', + inactive: 'Desactivat', + noRole: '(sense rol)', + edit: 'Editar', + delete: 'Esborrar', + deleteConfirm: 'Vols esborrar l\'usuari "{name}"? Anirà a la paperera i es pot restaurar.', + deleteFailed: "No s'ha pogut esborrar l'usuari.", + newPassword: 'Nova contrasenya', + noChange: '(sense canvis)', + save: 'Desar', + cancel: 'Cancel·lar', + appRolesTitle: 'Rols per app', + appRolesDesc: 'El rol global de dalt mana en aquest panell. Aquí es defineix quin rol té {name} dins de cada app quan aquella app demana el seu usuari per API.', + noAppRoles: 'Encara no hi ha rols assignats en cap app.', + chooseApp: 'Tria una app…', + assign: 'Assignar', + assignFailed: "No s'ha pogut assignar el rol.", + trashTitle: 'Paperera', + viewTrash: 'Veure paperera', + viewActive: 'Veure actius', + trashEmpty: 'No hi ha usuaris esborrats.', + deletedAt: 'Esborrat el {date}', + restore: 'Restaurar', + restoreFailed: "No s'ha pogut restaurar l'usuari.", + forceDelete: 'Esborrar definitivament', + forceDeleteConfirm: 'Vols esborrar definitivament "{name}"? Aquesta acció no es pot desfer.', + forceDeleteFailed: "No s'ha pogut esborrar definitivament.", + pendingTitle: 'Pendents', + viewPending: 'Pendents', + pendingEmpty: "No hi ha registres pendents d'aprovació.", + registeredAt: 'Es va registrar el {date}', + approve: 'Aprovar', + approveFailed: "No s'ha pogut aprovar l'usuari.", + reject: 'Rebutjar', + rejectConfirm: 'Vols rebutjar el registre de "{name}"? Anirà a la paperera i es pot restaurar després.', + rejectFailed: "No s'ha pogut rebutjar el registre.", + }, + analytics: { + title: 'Analítiques', + subtitle: "Sessions, logins per app i activitat d'usuaris.", + last7: 'Últims 7 dies', + last30: 'Últims 30 dies', + last90: 'Últims 90 dies', + totalUsers: 'Usuaris totals', + activeSessions: 'Sessions actives', + activeSessionsHint: 'tokens OAuth vigents', + loginsToday: 'Logins avui', + logins7d: 'Logins últims 7 dies', + loginsByDay: 'Logins per dia', + appsOAuth: 'Apps (OAuth)', + panelAdmin: 'Tauler admin', + loginsByApp: 'Logins per app', + topUsers: 'Usuaris més actius', + noAppLogins: 'Encara no hi ha logins d\'apps en aquest període.', + noUserActivity: 'Encara no hi ha activitat en aquest període.', + recentActivity: 'Activitat recent', + hide: 'Amagar', + viewAll: 'Veure-ho tot', + colUser: 'Usuari', + colApp: 'App', + colType: 'Tipus', + colIp: 'IP', + colWhen: 'Quan', + serviceNoUser: '(servei, sense usuari)', + deletedApp: '(app esborrada)', + recentCount: '{count} esdeveniments recents — clica "Veure-ho tot" per a la taula completa.', + chartAriaLabel: 'Logins per dia, apilat per tipus', + tooltipAppLabel: 'Apps (OAuth):', + tooltipSessionLabel: 'Tauler admin:', + barAriaLabel: "{date}: {oauth} logins d'apps, {session} al tauler admin", + }, +}; + +export default ca; diff --git a/resources/js/i18n/en.ts b/resources/js/i18n/en.ts new file mode 100644 index 0000000..31239ff --- /dev/null +++ b/resources/js/i18n/en.ts @@ -0,0 +1,209 @@ +import type { MessageSchema } from './es'; + +const en: MessageSchema = { + nav: { + dashboard: 'Dashboard', + clients: 'OAuth Clients', + tokens: 'Personal Access Tokens', + authorizedApps: 'Authorized Apps', + users: 'Users', + analytics: 'Analytics', + apiDocs: 'API Docs', + logout: 'Sign out', + }, + common: { + loading: 'Loading…', + creating: 'Creating…', + create: 'Create', + save: 'Save', + cancel: 'Cancel', + close: 'Close', + edit: 'Edit', + delete: 'Delete', + none: '(none)', + }, + login: { + title: 'Sign in', + subtitle: 'OAuth2 server — admin panel.', + email: 'Email', + password: 'Password', + submit: 'Sign in', + submitting: 'Signing in…', + noAccount: "Don't have an account?", + signUp: 'Sign up', + invalidCredentials: 'Invalid credentials.', + }, + register: { + title: 'Create account', + name: 'Name', + email: 'Email', + password: 'Password', + passwordConfirm: 'Confirm password', + submit: 'Create account', + submitFirstUser: 'Create admin account', + submitting: 'Creating…', + haveAccount: 'Already have an account?', + signIn: 'Sign in', + firstUserBanner: "There are no users yet. This account will be the administrator, with immediate access (no approval needed).", + pendingTitle: 'Account created', + pendingBody: 'An administrator has to approve your account before you can sign in. You may be notified outside the app once it is ready.', + backToLogin: 'Back to sign in', + }, + dashboard: { + greeting: 'Hi, {name}', + subtitle: "This is the OAuth2 server's admin panel.", + clientsTitle: 'OAuth Clients', + clientsDesc: 'Register apps (Authorization Code+PKCE, Client Credentials or Password Grant).', + tokensTitle: 'Personal Access Tokens', + tokensDesc: 'Generate tokens for direct API access, like API keys.', + appsTitle: 'Authorized Apps', + appsDesc: "Third-party apps you've granted access to your account.", + usersTitle: 'Users', + usersDesc: 'Create, edit role/status and delete accounts (admins only).', + analyticsTitle: 'Analytics', + analyticsDesc: 'Active sessions, logins by app and most active users (admins only).', + apiTitle: 'REST API', + apiDesc: 'This server exposes the {resource} resource (scopes {read}/{write}) so third-party apps can manage users via OAuth2. Requires a Passport access token. Interactive docs at {link}.', + }, + clients: { + title: 'OAuth Clients', + subtitle: 'Registered apps that can request tokens from this server.', + secretWarning: "Save this client secret now, you won't be able to see it again:", + clientIdLabel: 'client_id:', + clientSecretLabel: 'client_secret:', + newClient: 'New client', + name: 'Name', + grantType: 'Grant type', + grantAuthCode: 'Authorization Code + PKCE', + grantClientCredentials: 'Client Credentials', + grantPassword: 'Password Grant', + redirectUris: 'Redirect URIs (comma-separated)', + confidentialLabel: 'Confidential client (with secret). Uncheck for a public client that only uses PKCE.', + create: 'Create client', + empty: "You haven't created any clients yet.", + revoke: 'Revoke', + revokeConfirm: 'Revoke client "{name}"? Its tokens will stop working.', + clientIdShort: 'client_id', + redirectLabel: 'redirect', + }, + tokens: { + title: 'Personal Access Tokens', + subtitle: 'Direct API access tokens, without going through the authorize flow (like an API key).', + tokenWarning: "Save this token now, you won't be able to see it again:", + newToken: 'New token', + name: 'Name', + namePlaceholder: 'My script', + scopes: 'Scopes', + create: 'Create token', + empty: "You haven't created any tokens yet.", + revoke: 'Revoke', + revokeConfirm: 'Revoke token "{name}"?', + scopesLabel: 'scopes', + }, + authorizedApps: { + title: 'Authorized Apps', + subtitle: "Third-party apps you've granted access to your account.", + empty: "You haven't authorized any app yet.", + revoke: 'Revoke access', + revokeConfirm: 'Revoke access for "{name}"?', + scopesLabel: 'scopes', + }, + authorize: { + title: 'Authorize application', + wantsAccess: '{client} wants to access your account ({email}) with the following permissions:', + noScopes: 'No additional permissions requested (basic access).', + approve: 'Authorize', + cancel: 'Cancel', + notFoundTitle: 'Request not found', + notFoundBody: 'This screen only works when you arrive here redirected by a client application via {path}. Try again from that app.', + goDashboard: 'Go to dashboard', + }, + adminUsers: { + title: 'Users', + subtitle: 'Create, edit role/status and delete accounts.', + newUser: 'New user', + name: 'Name', + email: 'Email', + password: 'Password', + role: 'Role', + roleUser: 'User', + roleAdmin: 'Admin', + create: 'Create user', + colName: 'Name', + colEmail: 'Email', + colRole: 'Role', + colStatus: 'Status', + active: 'Active', + inactive: 'Deactivated', + noRole: '(no role)', + edit: 'Edit', + delete: 'Delete', + deleteConfirm: "Delete user \"{name}\"? They'll go to the trash and can be restored.", + deleteFailed: 'Could not delete the user.', + newPassword: 'New password', + noChange: '(no change)', + save: 'Save', + cancel: 'Cancel', + appRolesTitle: 'Roles per app', + appRolesDesc: 'The global role above rules this panel. Here you set what role {name} has inside each app when that app asks for their user via API.', + noAppRoles: 'No roles assigned in any app yet.', + chooseApp: 'Choose app…', + assign: 'Assign', + assignFailed: 'Could not assign the role.', + trashTitle: 'Trash', + viewTrash: 'View trash', + viewActive: 'View active', + trashEmpty: 'No deleted users.', + deletedAt: 'Deleted on {date}', + restore: 'Restore', + restoreFailed: 'Could not restore the user.', + forceDelete: 'Delete permanently', + forceDeleteConfirm: 'Permanently delete "{name}"? This action cannot be undone.', + forceDeleteFailed: 'Could not permanently delete the user.', + pendingTitle: 'Pending', + viewPending: 'Pending', + pendingEmpty: 'No registrations pending approval.', + registeredAt: 'Registered on {date}', + approve: 'Approve', + approveFailed: 'Could not approve the user.', + reject: 'Reject', + rejectConfirm: 'Reject the registration for "{name}"? It will go to the trash and can be restored later.', + rejectFailed: 'Could not reject the registration.', + }, + analytics: { + title: 'Analytics', + subtitle: 'Sessions, logins by app and user activity.', + last7: 'Last 7 days', + last30: 'Last 30 days', + last90: 'Last 90 days', + totalUsers: 'Total users', + activeSessions: 'Active sessions', + activeSessionsHint: 'valid OAuth tokens', + loginsToday: 'Logins today', + logins7d: 'Logins last 7 days', + loginsByDay: 'Logins by day', + appsOAuth: 'Apps (OAuth)', + panelAdmin: 'Admin panel', + loginsByApp: 'Logins by app', + topUsers: 'Most active users', + noAppLogins: 'No app logins in this period yet.', + noUserActivity: 'No activity in this period yet.', + recentActivity: 'Recent activity', + hide: 'Hide', + viewAll: 'View all', + colUser: 'User', + colApp: 'App', + colType: 'Type', + colIp: 'IP', + colWhen: 'When', + serviceNoUser: '(service, no user)', + deletedApp: '(deleted app)', + recentCount: '{count} recent events — click "View all" for the full table.', + chartAriaLabel: 'Logins by day, stacked by type', + tooltipAppLabel: 'Apps (OAuth):', + tooltipSessionLabel: 'Admin panel:', + barAriaLabel: '{date}: {oauth} app logins, {session} to admin panel', + }, +}; + +export default en; diff --git a/resources/js/i18n/es.ts b/resources/js/i18n/es.ts new file mode 100644 index 0000000..ac69970 --- /dev/null +++ b/resources/js/i18n/es.ts @@ -0,0 +1,208 @@ +const es = { + nav: { + dashboard: 'Dashboard', + clients: 'Clientes OAuth', + tokens: 'Personal Access Tokens', + authorizedApps: 'Apps autorizadas', + users: 'Usuarios', + analytics: 'Analíticas', + apiDocs: 'API Docs', + logout: 'Salir', + }, + common: { + loading: 'Cargando…', + creating: 'Creando…', + create: 'Crear', + save: 'Guardar', + cancel: 'Cancelar', + close: 'Cerrar', + edit: 'Editar', + delete: 'Borrar', + none: '(ninguno)', + }, + login: { + title: 'Ingresar', + subtitle: 'Servidor OAuth2 — panel de administración.', + email: 'Email', + password: 'Contraseña', + submit: 'Ingresar', + submitting: 'Ingresando…', + noAccount: '¿No tenés cuenta?', + signUp: 'Registrate', + invalidCredentials: 'Credenciales inválidas.', + }, + register: { + title: 'Crear cuenta', + name: 'Nombre', + email: 'Email', + password: 'Contraseña', + passwordConfirm: 'Confirmar contraseña', + submit: 'Crear cuenta', + submitFirstUser: 'Crear cuenta de administrador', + submitting: 'Creando…', + haveAccount: '¿Ya tenés cuenta?', + signIn: 'Ingresá', + firstUserBanner: 'Todavía no hay ningún usuario. Esta cuenta va a quedar como administradora, con acceso inmediato (sin aprobación).', + pendingTitle: 'Cuenta creada', + pendingBody: 'Un administrador tiene que aprobar tu cuenta antes de que puedas ingresar. Te va a poder avisar por fuera de la app cuando esté lista.', + backToLogin: 'Volver a ingresar', + }, + dashboard: { + greeting: 'Hola, {name}', + subtitle: 'Este es el panel de administración del servidor OAuth2.', + clientsTitle: 'Clientes OAuth', + clientsDesc: 'Registrá apps (Authorization Code+PKCE, Client Credentials o Password Grant).', + tokensTitle: 'Personal Access Tokens', + tokensDesc: 'Generá tokens de acceso directo a la API, como API keys.', + appsTitle: 'Apps autorizadas', + appsDesc: 'Apps de terceros a las que le diste acceso a tu cuenta.', + usersTitle: 'Usuarios', + usersDesc: 'Alta, edición de rol/estado y baja de cuentas (solo admins).', + analyticsTitle: 'Analíticas', + analyticsDesc: 'Sesiones activas, logins por app y usuarios más activos (solo admins).', + apiTitle: 'API REST', + apiDesc: 'Este servidor expone el recurso {resource} (scopes {read}/{write}) para que aplicaciones de terceros gestionen usuarios vía OAuth2. Requiere un access token de Passport. Documentación interactiva en {link}.', + }, + clients: { + title: 'Clientes OAuth', + subtitle: 'Apps registradas que pueden pedir tokens a este servidor.', + secretWarning: 'Guardá este client secret ahora, no se puede volver a ver:', + clientIdLabel: 'client_id:', + clientSecretLabel: 'client_secret:', + newClient: 'Nuevo cliente', + name: 'Nombre', + grantType: 'Grant type', + grantAuthCode: 'Authorization Code + PKCE', + grantClientCredentials: 'Client Credentials', + grantPassword: 'Password Grant', + redirectUris: 'Redirect URIs (separadas por coma)', + confidentialLabel: 'Cliente confidencial (con secret). Desmarcá para un cliente público que solo use PKCE.', + create: 'Crear cliente', + empty: 'Todavía no creaste ningún cliente.', + revoke: 'Revocar', + revokeConfirm: '¿Revocar el cliente "{name}"? Sus tokens dejarán de funcionar.', + clientIdShort: 'client_id', + redirectLabel: 'redirect', + }, + tokens: { + title: 'Personal Access Tokens', + subtitle: 'Tokens de acceso directo a la API, sin pasar por el flujo de authorize (tipo API key).', + tokenWarning: 'Guardá este token ahora, no se puede volver a ver:', + newToken: 'Nuevo token', + name: 'Nombre', + namePlaceholder: 'Mi script', + scopes: 'Scopes', + create: 'Crear token', + empty: 'Todavía no creaste ningún token.', + revoke: 'Revocar', + revokeConfirm: '¿Revocar el token "{name}"?', + scopesLabel: 'scopes', + }, + authorizedApps: { + title: 'Apps autorizadas', + subtitle: 'Aplicaciones de terceros a las que le diste acceso a tu cuenta.', + empty: 'No autorizaste ninguna app todavía.', + revoke: 'Revocar acceso', + revokeConfirm: '¿Revocar el acceso de "{name}"?', + scopesLabel: 'scopes', + }, + authorize: { + title: 'Autorizar aplicación', + wantsAccess: '{client} quiere acceder a tu cuenta ({email}) con los siguientes permisos:', + noScopes: 'No solicita permisos adicionales (acceso básico).', + approve: 'Autorizar', + cancel: 'Cancelar', + notFoundTitle: 'Solicitud no encontrada', + notFoundBody: 'Esta pantalla solo funciona cuando llegás acá redirigido por una aplicación cliente vía {path}. Volvé a intentar desde esa app.', + goDashboard: 'Ir al dashboard', + }, + adminUsers: { + title: 'Usuarios', + subtitle: 'Alta, edición de rol/estado y baja de cuentas.', + newUser: 'Nuevo usuario', + name: 'Nombre', + email: 'Email', + password: 'Contraseña', + role: 'Rol', + roleUser: 'Usuario', + roleAdmin: 'Admin', + create: 'Crear usuario', + colName: 'Nombre', + colEmail: 'Email', + colRole: 'Rol', + colStatus: 'Estado', + active: 'Activo', + inactive: 'Desactivado', + noRole: '(sin rol)', + edit: 'Editar', + delete: 'Borrar', + deleteConfirm: '¿Borrar al usuario "{name}"? Va a la papelera y se puede restaurar.', + deleteFailed: 'No se pudo borrar el usuario.', + newPassword: 'Nueva contraseña', + noChange: '(sin cambios)', + save: 'Guardar', + cancel: 'Cancelar', + appRolesTitle: 'Roles por app', + appRolesDesc: 'El rol global de arriba manda en este panel. Acá se define qué rol tiene {name} dentro de cada app cuando esa app pide su usuario por API.', + noAppRoles: 'Sin roles asignados en ninguna app todavía.', + chooseApp: 'Elegir app…', + assign: 'Asignar', + assignFailed: 'No se pudo asignar el rol.', + trashTitle: 'Papelera', + viewTrash: 'Ver papelera', + viewActive: 'Ver activos', + trashEmpty: 'No hay usuarios borrados.', + deletedAt: 'Borrado el {date}', + restore: 'Restaurar', + restoreFailed: 'No se pudo restaurar el usuario.', + forceDelete: 'Borrar definitivamente', + forceDeleteConfirm: '¿Borrar definitivamente a "{name}"? Esta acción no se puede deshacer.', + forceDeleteFailed: 'No se pudo borrar definitivamente.', + pendingTitle: 'Pendientes', + viewPending: 'Pendientes', + pendingEmpty: 'No hay registros pendientes de aprobación.', + registeredAt: 'Se registró el {date}', + approve: 'Aprobar', + approveFailed: 'No se pudo aprobar el usuario.', + reject: 'Rechazar', + rejectConfirm: '¿Rechazar el registro de "{name}"? Va a la papelera y se puede restaurar después.', + rejectFailed: 'No se pudo rechazar el registro.', + }, + analytics: { + title: 'Analíticas', + subtitle: 'Sesiones, logins por app y actividad de usuarios.', + last7: 'Últimos 7 días', + last30: 'Últimos 30 días', + last90: 'Últimos 90 días', + totalUsers: 'Usuarios totales', + activeSessions: 'Sesiones activas', + activeSessionsHint: 'tokens OAuth vigentes', + loginsToday: 'Logins hoy', + logins7d: 'Logins últimos 7 días', + loginsByDay: 'Logins por día', + appsOAuth: 'Apps (OAuth)', + panelAdmin: 'Panel admin', + loginsByApp: 'Logins por app', + topUsers: 'Usuarios más activos', + noAppLogins: 'Todavía no hay logins de apps en este período.', + noUserActivity: 'Todavía no hay actividad en este período.', + recentActivity: 'Actividad reciente', + hide: 'Ocultar', + viewAll: 'Ver todo', + colUser: 'Usuario', + colApp: 'App', + colType: 'Tipo', + colIp: 'IP', + colWhen: 'Cuándo', + serviceNoUser: '(servicio, sin usuario)', + deletedApp: '(app borrada)', + recentCount: '{count} eventos recientes — click en "Ver todo" para la tabla completa.', + chartAriaLabel: 'Logins por día, apilado por tipo', + tooltipAppLabel: 'Apps (OAuth):', + tooltipSessionLabel: 'Panel admin:', + barAriaLabel: '{date}: {oauth} logins de apps, {session} al panel admin', + }, +}; + +export default es; +export type MessageSchema = typeof es; diff --git a/resources/js/i18n/index.ts b/resources/js/i18n/index.ts new file mode 100644 index 0000000..f2ec631 --- /dev/null +++ b/resources/js/i18n/index.ts @@ -0,0 +1,20 @@ +import { createI18n } from 'vue-i18n'; +import ca from './ca'; +import en from './en'; +import es, { type MessageSchema } from './es'; + +const SUPPORTED = ['es', 'en', 'ca'] as const; +type Locale = (typeof SUPPORTED)[number]; + +function isSupported(locale: string): locale is Locale { + return (SUPPORTED as readonly string[]).includes(locale); +} + +const i18n = createI18n<[MessageSchema], Locale>({ + legacy: false, + locale: isSupported(window.__LOCALE__) ? window.__LOCALE__ : 'es', + fallbackLocale: 'es', + messages: { en, es, ca }, +}); + +export default i18n; diff --git a/resources/js/pages/Authorize.vue b/resources/js/pages/Authorize.vue new file mode 100644 index 0000000..fb14093 --- /dev/null +++ b/resources/js/pages/Authorize.vue @@ -0,0 +1,70 @@ + + + diff --git a/resources/js/pages/AuthorizedApps.vue b/resources/js/pages/AuthorizedApps.vue new file mode 100644 index 0000000..fd75061 --- /dev/null +++ b/resources/js/pages/AuthorizedApps.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/resources/js/pages/Clients.vue b/resources/js/pages/Clients.vue new file mode 100644 index 0000000..addfec7 --- /dev/null +++ b/resources/js/pages/Clients.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/resources/js/pages/Dashboard.vue b/resources/js/pages/Dashboard.vue new file mode 100644 index 0000000..3341e4b --- /dev/null +++ b/resources/js/pages/Dashboard.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/resources/js/pages/Login.vue b/resources/js/pages/Login.vue new file mode 100644 index 0000000..0a35d46 --- /dev/null +++ b/resources/js/pages/Login.vue @@ -0,0 +1,69 @@ + + + diff --git a/resources/js/pages/Register.vue b/resources/js/pages/Register.vue new file mode 100644 index 0000000..9bc153a --- /dev/null +++ b/resources/js/pages/Register.vue @@ -0,0 +1,103 @@ + + + diff --git a/resources/js/pages/Tokens.vue b/resources/js/pages/Tokens.vue new file mode 100644 index 0000000..0a2a177 --- /dev/null +++ b/resources/js/pages/Tokens.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/resources/js/pages/admin/Analytics.vue b/resources/js/pages/admin/Analytics.vue new file mode 100644 index 0000000..1189dff --- /dev/null +++ b/resources/js/pages/admin/Analytics.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/resources/js/pages/admin/Users.vue b/resources/js/pages/admin/Users.vue new file mode 100644 index 0000000..881c654 --- /dev/null +++ b/resources/js/pages/admin/Users.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/resources/js/router/index.ts b/resources/js/router/index.ts new file mode 100644 index 0000000..6a05586 --- /dev/null +++ b/resources/js/router/index.ts @@ -0,0 +1,96 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import { useAuthStore } from '../stores/auth'; + +declare module 'vue-router' { + interface RouteMeta { + requiresAuth?: boolean; + requiresAdmin?: boolean; + guestOnly?: boolean; + } +} + +const routes = [ + { + path: '/', + name: 'dashboard', + component: () => import('../pages/Dashboard.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/login', + name: 'login', + component: () => import('../pages/Login.vue'), + meta: { guestOnly: true }, + }, + { + path: '/register', + name: 'register', + component: () => import('../pages/Register.vue'), + meta: { guestOnly: true }, + }, + { + path: '/clients', + name: 'clients', + component: () => import('../pages/Clients.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/tokens', + name: 'tokens', + component: () => import('../pages/Tokens.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/authorized-apps', + name: 'authorized-apps', + component: () => import('../pages/AuthorizedApps.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/oauth/authorize', + name: 'oauth-authorize', + component: () => import('../pages/Authorize.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/admin/users', + name: 'admin-users', + component: () => import('../pages/admin/Users.vue'), + meta: { requiresAuth: true, requiresAdmin: true }, + }, + { + path: '/admin/analytics', + name: 'admin-analytics', + component: () => import('../pages/admin/Analytics.vue'), + meta: { requiresAuth: true, requiresAdmin: true }, + }, +]; + +const router = createRouter({ + history: createWebHistory(), + routes, +}); + +router.beforeEach(async (to) => { + const auth = useAuthStore(); + + if (!auth.checked) { + await auth.fetchUser(); + } + + if (to.meta.requiresAuth && !auth.isAuthenticated) { + return { name: 'login', query: { redirect: to.fullPath } }; + } + + if (to.meta.requiresAdmin && !auth.isAdmin) { + return { name: 'dashboard' }; + } + + if (to.meta.guestOnly && auth.isAuthenticated) { + return { name: 'dashboard' }; + } + + return true; +}); + +export default router; diff --git a/resources/js/stores/auth.ts b/resources/js/stores/auth.ts new file mode 100644 index 0000000..82abf70 --- /dev/null +++ b/resources/js/stores/auth.ts @@ -0,0 +1,91 @@ +import { defineStore } from 'pinia'; +import axios from 'axios'; +import type { User } from '../types/models'; + +interface AuthState { + user: User | null; + checked: boolean; +} + +interface Credentials { + email: string; + password: string; + remember?: boolean; +} + +interface RegisterPayload { + name: string; + email: string; + password: string; + password_confirmation: string; +} + +interface RegisterResult { + bootstrap: boolean; + message?: string; +} + +export const useAuthStore = defineStore('auth', { + state: (): AuthState => ({ + user: null, + checked: false, + }), + + getters: { + isAuthenticated: (state): boolean => state.user !== null, + isAdmin: (state): boolean => Boolean(state.user?.roles?.includes('admin')), + }, + + actions: { + async fetchUser(): Promise { + try { + const { data } = await axios.get<{ user: User }>('/web-api/me'); + this.user = data.user; + } catch { + this.user = null; + } finally { + this.checked = true; + } + }, + + async login(payload: Credentials): Promise { + const { data } = await axios.post<{ user: User; intended: string | null }>('/web-api/login', payload); + this.user = data.user; + this.checked = true; + + return data.intended ?? null; + }, + + // Si todavía no hay ningún usuario en el sistema, el registro loguea de + // una como admin (bootstrap). Si ya hay usuarios, la cuenta queda + // pendiente hasta que un admin la aprueba (ver AuthController::register). + async register(payload: RegisterPayload): Promise { + const { data } = await axios.post<{ + bootstrap?: true; + user?: User; + pending?: true; + message?: string; + }>('/web-api/register', payload); + + if (data.bootstrap && data.user) { + this.user = data.user; + this.checked = true; + + return { bootstrap: true }; + } + + return { bootstrap: false, message: data.message }; + }, + + async setupIsEmpty(): Promise { + const { data } = await axios.get<{ empty: boolean }>('/web-api/setup-status'); + + return data.empty; + }, + + async logout(): Promise { + await axios.post('/web-api/logout'); + this.user = null; + }, + }, +}); diff --git a/resources/js/types/models.ts b/resources/js/types/models.ts new file mode 100644 index 0000000..5c2e55e --- /dev/null +++ b/resources/js/types/models.ts @@ -0,0 +1,90 @@ +export interface User { + id: number; + name: string; + email: string; + is_active: boolean; + roles: string[]; + permissions?: string[]; + created_at: string; + deleted_at?: string | null; + approved_at?: string | null; +} + +export interface OAuthClient { + id: string; + owner_id: number; + owner_type: string; + name: string; + secret: string | null; + provider: string | null; + redirect_uris: string[]; + grant_types: string[]; + revoked: boolean; + created_at: string; + updated_at: string; +} + +export interface PersonalAccessToken { + id: string; + name: string; + scopes: string[]; + created_at: string; + expires_at: string | null; +} + +export interface AuthorizedAppToken { + id: string; + user_id: number; + client_id: string; + name: string | null; + scopes: string[]; + revoked: boolean; + created_at: string; + updated_at: string; + expires_at: string | null; + client: { id: string; name: string }; +} + +export interface Scope { + id: string; + description: string; +} + +export interface OAuthApp { + id: string; + name: string; +} + +export interface AppRoleGroup { + client_id: string; + client_name: string; + roles: string[]; +} + +export interface AnalyticsSummary { + kpis: { + total_users: number; + active_sessions: number; + logins_today: number; + logins_7d: number; + }; + logins_by_day: Array<{ date: string; session: number; oauth: number }>; + logins_by_app: Array<{ client_name: string; count: number }>; + top_users: Array<{ name: string; email: string; count: number }>; + recent: Array<{ + user_name: string | null; + user_email: string | null; + client_name: string; + type: 'session' | 'oauth'; + ip_address: string | null; + created_at: string; + }>; +} + +export interface OAuthAuthorizePayload { + authToken: string; + csrfToken: string; + client: { id: string; name: string }; + scopes: Scope[]; + user: { name: string; email: string }; +} diff --git a/resources/js/vite-env.d.ts b/resources/js/vite-env.d.ts new file mode 100644 index 0000000..9fc7cd7 --- /dev/null +++ b/resources/js/vite-env.d.ts @@ -0,0 +1,13 @@ +/// + +import type { OAuthAuthorizePayload } from './types/models'; + +declare global { + interface Window { + __LOCALE__: 'es' | 'en' | 'ca'; + __SESSION_LOCALE__: string; + __OAUTH_AUTHORIZE__?: OAuthAuthorizePayload; + } +} + +export {}; diff --git a/resources/scss/abstracts/_mixins.scss b/resources/scss/abstracts/_mixins.scss new file mode 100644 index 0000000..4a9c829 --- /dev/null +++ b/resources/scss/abstracts/_mixins.scss @@ -0,0 +1,35 @@ +// Equivalente al prefijo `dark:` de Tailwind: el toggle de tema pone la clase +// `.dark` en (ver resources/js/composables/useTheme.ts), así que +// cualquier regla dentro de este mixin solo aplica bajo esa clase ancestro. +// Uso en los partials globales de components/ (no pasan por el compilador +// "scoped" de Vue, así que acá ".dark &" alcanza). Los dos componentes que +// SÍ usan + @if(config('l5-swagger.defaults.ui.display.dark_mode')) + + @endif + + + +
    + + + + + + diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..5fdfa1e --- /dev/null +++ b/routes/api.php @@ -0,0 +1,44 @@ +middleware('auth:api'); + +// Directorio de usuarios (admin) — self-service para uno mismo, permiso users.* para el resto. +// "/users/trashed" tiene que registrarse ANTES de la apiResource: si no, Laravel +// intenta bindear "trashed" como {user} de la ruta show y nunca llega acá. +Route::get('/users/trashed', [UserController::class, 'trashed']); +Route::get('/users/pending', [UserController::class, 'pending']); +Route::post('/users/{id}/restore', [UserController::class, 'restore'])->whereNumber('id'); +Route::delete('/users/{id}/force', [UserController::class, 'forceDelete'])->whereNumber('id'); +Route::apiResource('users', UserController::class); +Route::post('/users/{user}/approve', [UserController::class, 'approve']); +Route::get('/users/{user}/app-roles', [UserController::class, 'appRoles']); +Route::post('/users/{user}/app-roles', [UserController::class, 'assignAppRole']); +Route::delete('/users/{user}/app-roles/{clientId}/{role}', [UserController::class, 'revokeAppRole']); + +// Apps registradas en el sistema (admin, para el selector de roles-por-app). +Route::get('/apps', [AppController::class, 'index']); + +// Analíticas de uso: sesiones, logins por app, actividad reciente. +Route::get('/analytics/summary', [AnalyticsController::class, 'summary']); + +// Cuenta propia: clientes OAuth, personal access tokens y apps autorizadas. +// Todo esto es lo mismo que ofrece la SPA Vue por sesión (routes/web.php), pero +// vía Bearer token — para que cualquier cliente (Angular, Flutter, etc.) pueda +// construir su propio panel sin depender de la sesión de Laravel. +Route::apiResource('clients', ClientController::class)->except(['show'])->names('api.clients'); + +Route::get('/personal-access-tokens', [PersonalAccessTokenController::class, 'index']); +Route::post('/personal-access-tokens', [PersonalAccessTokenController::class, 'store']); +Route::delete('/personal-access-tokens/{tokenId}', [PersonalAccessTokenController::class, 'destroy']); + +Route::get('/authorized-apps', [AuthorizedAppController::class, 'index']); +Route::delete('/authorized-apps/{tokenId}', [AuthorizedAppController::class, 'destroy']); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 0000000..3c9adf1 --- /dev/null +++ b/routes/console.php @@ -0,0 +1,8 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..42e7fd4 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,74 @@ +validate(['locale' => 'required|in:es,en,ca']); + session(['locale' => request('locale')]); + + return response()->noContent(); +}); + +// Endpoints de sesión (guard "web") que consume la SPA para loguearse y +// administrar el servidor OAuth2 (clientes, personal access tokens, apps autorizadas). +Route::prefix('web-api')->group(function () { + Route::get('/setup-status', [AuthController::class, 'setupStatus']); + Route::post('/register', [AuthController::class, 'register']); + Route::post('/login', [AuthController::class, 'login']); + + Route::middleware('auth')->group(function () { + Route::post('/logout', [AuthController::class, 'logout']); + Route::get('/me', [AuthController::class, 'me']); + Route::get('/scopes', fn () => response()->json(Passport::scopes())); + + Route::apiResource('clients', ClientController::class)->except(['show']); + + Route::get('/personal-access-tokens', [PersonalAccessTokenController::class, 'index']); + Route::post('/personal-access-tokens', [PersonalAccessTokenController::class, 'store']); + Route::delete('/personal-access-tokens/{tokenId}', [PersonalAccessTokenController::class, 'destroy']); + + Route::get('/authorized-apps', [AuthorizedAppController::class, 'index']); + Route::delete('/authorized-apps/{tokenId}', [AuthorizedAppController::class, 'destroy']); + + // Panel de administración de usuarios (solo para roles/permisos con "users.*"). + Route::prefix('admin')->group(function () { + Route::get('/users', [UserController::class, 'index'])->middleware('can:users.view'); + Route::get('/users/trashed', [UserController::class, 'trashed'])->middleware('can:users.view'); + Route::get('/users/pending', [UserController::class, 'pending'])->middleware('can:users.view'); + Route::post('/users', [UserController::class, 'store'])->middleware('can:users.create'); + Route::put('/users/{user}', [UserController::class, 'update'])->middleware('can:users.update'); + Route::delete('/users/{user}', [UserController::class, 'destroy'])->middleware('can:users.delete'); + Route::post('/users/{id}/restore', [UserController::class, 'restore'])->middleware('can:users.update')->whereNumber('id'); + Route::delete('/users/{id}/force', [UserController::class, 'forceDelete'])->middleware('can:users.delete')->whereNumber('id'); + Route::post('/users/{user}/approve', [UserController::class, 'approve'])->middleware('can:users.update'); + + // Roles por app (multi-tenant): a qué app y con qué rol puede entrar cada usuario. + Route::get('/apps', [AppController::class, 'index'])->middleware('can:users.view'); + Route::get('/users/{user}/app-roles', [UserController::class, 'appRoles'])->middleware('can:users.view'); + Route::post('/users/{user}/app-roles', [UserController::class, 'assignAppRole'])->middleware('can:users.update'); + Route::delete('/users/{user}/app-roles/{clientId}/{role}', [UserController::class, 'revokeAppRole'])->middleware('can:users.update'); + + // Analíticas de uso: sesiones, logins por app, actividad reciente. + Route::get('/analytics/summary', [AnalyticsController::class, 'summary'])->middleware('can:users.view'); + }); + }); +}); + +// Laravel/Passport redirige a los invitados no autenticados a route('login'), así que +// necesita una ruta fija (no el wildcard de abajo, que exige un parámetro). +Route::view('/login', 'app')->name('login'); + +// Todo lo demás (home, register, dashboard, /oauth/authorize cuando hay sesión, etc.) +// lo resuelve el shell de la SPA Vue (Vue Router decide qué pantalla mostrar). +Route::view('/', 'app'); +Route::get('/{any}', fn () => view('app')) + ->where('any', '^(?!web-api|api|oauth|storage|login).*$'); diff --git a/storage/api-docs/api-docs.json b/storage/api-docs/api-docs.json new file mode 100644 index 0000000..f6b30fb --- /dev/null +++ b/storage/api-docs/api-docs.json @@ -0,0 +1,1133 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "OAuth2 Identity Server API", + "description": "Servidor de identidad/OAuth2 (Laravel Passport) para que aplicaciones de terceros se autentiquen y gestionen usuarios. Pensada para ser consumida por aplicaciones cliente de terceros (Angular, Flutter, NestJS, etc.) que quieran construir su propio panel sin depender de la sesión de Laravel.", + "version": "1.0.0" + }, + "servers": [ + { + "url": "/api", + "description": "API base URL" + } + ], + "paths": { + "/analytics/summary": { + "get": { + "tags": [ + "Analytics" + ], + "summary": "Métricas de uso: logins por día, por app, usuarios más activos y actividad reciente", + "description": "Requiere el permiso users.view (o un token client_credentials, que actúa como servicio de confianza).", + "operationId": "b34ca6a4b161498d5b34ed3054ddc39d", + "parameters": [ + { + "name": "days", + "in": "query", + "description": "Ventana en días (7-90, default 30)", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Resumen de analíticas" + }, + "403": { + "description": "Sin permiso users.view" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + } + }, + "/apps": { + "get": { + "tags": [ + "Users" + ], + "summary": "Listar todas las apps (clientes OAuth) registradas en el sistema", + "description": "Requiere el permiso users.view (o un token client_credentials, que actúa como servicio de confianza). Se usa para armar el selector de \"roles por app\".", + "operationId": "5a879a1d739e5b67999e22de46d3223b", + "responses": { + "200": { + "description": "Listado de apps" + }, + "403": { + "description": "Sin permiso users.view" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + } + }, + "/authorized-apps": { + "get": { + "tags": [ + "Account" + ], + "summary": "Listar apps de terceros a las que le diste acceso a tu cuenta", + "operationId": "52cd9fb5a0e5a127774bdd7fa8456851", + "responses": { + "200": { + "description": "Listado de tokens/apps autorizadas" + } + }, + "security": [ + { + "oauth2": [ + "account:read" + ] + } + ] + } + }, + "/authorized-apps/{tokenId}": { + "delete": { + "tags": [ + "Account" + ], + "summary": "Revocar el acceso de una app de terceros", + "operationId": "59b2351fe30ac2a4c717926d094d08c9", + "parameters": [ + { + "name": "tokenId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Acceso revocado" + }, + "404": { + "description": "No existe o no es tuyo" + } + }, + "security": [ + { + "oauth2": [ + "account:write" + ] + } + ] + } + }, + "/clients": { + "get": { + "tags": [ + "Account" + ], + "summary": "Listar tus clientes OAuth (apps que registraste)", + "operationId": "6536f8d22d25758c3e14dbbe8e228af0", + "responses": { + "200": { + "description": "Listado de clientes", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Client" + } + } + } + } + }, + "422": { + "description": "El token no tiene un usuario asociado (ej. client_credentials)" + } + }, + "security": [ + { + "oauth2": [ + "account:read" + ] + } + ] + }, + "post": { + "tags": [ + "Account" + ], + "summary": "Registrar un nuevo cliente OAuth (tu app)", + "operationId": "74a35b85418e09c2489915865dd22445", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "required": [ + "name", + "grant_type" + ], + "properties": { + "name": { + "type": "string" + }, + "grant_type": { + "type": "string", + "enum": [ + "authorization_code", + "client_credentials", + "password" + ] + }, + "redirect_uris": { + "type": "array", + "items": { + "type": "string" + } + }, + "confidential": { + "type": "boolean", + "default": true + } + }, + "type": "object" + } + } + } + }, + "responses": { + "201": { + "description": "Cliente creado (incluye plain_secret una sola vez)" + }, + "422": { + "description": "Datos inválidos o token sin usuario asociado" + } + }, + "security": [ + { + "oauth2": [ + "account:write" + ] + } + ] + } + }, + "/clients/{client}": { + "put": { + "tags": [ + "Account" + ], + "summary": "Editar uno de tus clientes OAuth", + "operationId": "01a0e98b651c8cda71034d93d40b8b27", + "parameters": [ + { + "name": "client", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Cliente actualizado", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Client" + } + } + } + }, + "404": { + "description": "No es tuyo o no existe" + } + }, + "security": [ + { + "oauth2": [ + "account:write" + ] + } + ] + }, + "delete": { + "tags": [ + "Account" + ], + "summary": "Revocar uno de tus clientes OAuth (y sus tokens)", + "operationId": "ed21785e71ab67958cf6216b6cf263a3", + "parameters": [ + { + "name": "client", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Revocado" + }, + "404": { + "description": "No es tuyo o no existe" + } + }, + "security": [ + { + "oauth2": [ + "account:write" + ] + } + ] + } + }, + "/personal-access-tokens": { + "get": { + "tags": [ + "Account" + ], + "summary": "Listar tus Personal Access Tokens", + "operationId": "b94780059af9e6c94456302b3142b3cb", + "responses": { + "200": { + "description": "Listado de tokens" + } + }, + "security": [ + { + "oauth2": [ + "account:read" + ] + } + ] + }, + "post": { + "tags": [ + "Account" + ], + "summary": "Crear un Personal Access Token (tipo API key)", + "operationId": "6e653bdc7fa6bdd2768842f92d575ae7", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "type": "object" + } + } + } + }, + "responses": { + "201": { + "description": "Token creado (access_token solo se muestra esta vez)" + } + }, + "security": [ + { + "oauth2": [ + "account:write" + ] + } + ] + } + }, + "/personal-access-tokens/{tokenId}": { + "delete": { + "tags": [ + "Account" + ], + "summary": "Revocar un Personal Access Token", + "operationId": "d72271ccb6b2630a6d33c20516229723", + "parameters": [ + { + "name": "tokenId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Revocado" + }, + "404": { + "description": "No existe o no es tuyo" + } + }, + "security": [ + { + "oauth2": [ + "account:write" + ] + } + ] + } + }, + "/user": { + "get": { + "tags": [ + "Users" + ], + "summary": "Usuario del token actual (whoami) + sus roles global y en la app que llama", + "operationId": "853204b4b2f8a255a3721aaca3407e72", + "responses": { + "200": { + "description": "Usuario autenticado", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "401": { + "description": "Token inválido o sin usuario asociado (ej. client_credentials)" + } + }, + "security": [ + { + "oauth2": [] + } + ] + } + }, + "/users": { + "get": { + "tags": [ + "Users" + ], + "summary": "Listar usuarios", + "description": "Incluye usuarios pendientes de aprobación del panel admin (ver campo approved_at) — esa aprobación solo gobierna el acceso al panel de sesión de esta app, no la consulta de usuarios vía API.", + "operationId": "7208c29037df2b8bb02499ba39ed8a78", + "responses": { + "200": { + "description": "Listado de usuarios", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "403": { + "description": "Sin permiso users.view" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Crear un usuario", + "operationId": "262eb5ca1fdea354023c0a8870442c1e", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "required": [ + "name", + "email", + "password" + ], + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string", + "format": "password" + }, + "role": { + "type": "string", + "example": "user" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "201": { + "description": "Usuario creado", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "403": { + "description": "Sin permiso users.create" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + }, + "/users/{user}": { + "get": { + "tags": [ + "Users" + ], + "summary": "Ver un usuario (el propio siempre permitido; otros requieren users.view)", + "operationId": "a8a7a1f979a2abb839b4b320238106fc", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Datos del usuario", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "403": { + "description": "Sin permiso users.view" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + }, + "put": { + "tags": [ + "Users" + ], + "summary": "Editar un usuario (el propio siempre permitido; rol/estado y otros usuarios requieren users.update)", + "operationId": "4ac3faef1359369686fdd433daad2bee", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string", + "format": "password" + }, + "is_active": { + "type": "boolean" + }, + "role": { + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Usuario actualizado", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "403": { + "description": "Sin permiso users.update" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Borrar un usuario (requiere users.delete; no se puede autoeliminar)", + "operationId": "371ba09bb6d4a95792dd93040f8812b3", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Usuario borrado" + }, + "403": { + "description": "Sin permiso users.delete" + }, + "422": { + "description": "No se puede autoeliminar ni borrar al último admin" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + }, + "/users/trashed": { + "get": { + "tags": [ + "Users" + ], + "summary": "Listar usuarios borrados (papelera)", + "operationId": "ac10f52342c5e5c0d77d46764b6e0637", + "responses": { + "200": { + "description": "Listado de usuarios en la papelera", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "403": { + "description": "Sin permiso users.view" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + } + }, + "/users/{id}/restore": { + "post": { + "tags": [ + "Users" + ], + "summary": "Restaurar un usuario borrado", + "operationId": "0ec16b4b1d92c2d61463d74d9c045701", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Usuario restaurado", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "403": { + "description": "Sin permiso users.update" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + }, + "/users/{id}/force": { + "delete": { + "tags": [ + "Users" + ], + "summary": "Borrar un usuario definitivamente (tiene que estar en la papelera)", + "operationId": "093b171b76c7e960668a7c9adf16e9ef", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Borrado definitivamente" + }, + "403": { + "description": "Sin permiso users.delete" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + }, + "/users/pending": { + "get": { + "tags": [ + "Users" + ], + "summary": "Listar usuarios autorregistrados que todavía no aprobó ningún admin", + "operationId": "373548f0068d0e9154443cb895254faf", + "responses": { + "200": { + "description": "Listado de usuarios pendientes", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "403": { + "description": "Sin permiso users.view" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + } + }, + "/users/{user}/approve": { + "post": { + "tags": [ + "Users" + ], + "summary": "Aprobar un registro pendiente", + "operationId": "c9f59dde1d9a997c3f33c22af5ffc0f0", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Usuario aprobado", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "403": { + "description": "Sin permiso users.update" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + }, + "/users/{user}/app-roles": { + "get": { + "tags": [ + "Users" + ], + "summary": "Roles que el usuario tiene en cada app (el propio siempre permitido; otros requieren users.view)", + "operationId": "9f0336429727034d7b79d1dd1ec210e2", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Roles agrupados por app" + } + }, + "security": [ + { + "oauth2": [ + "users:read" + ] + } + ] + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Asignar un rol a un usuario dentro de una app (requiere users.update; sin bypass por self)", + "operationId": "108e24d381e03dcbde787f187bff167f", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "required": [ + "client_id", + "role" + ], + "properties": { + "client_id": { + "type": "string", + "format": "uuid" + }, + "role": { + "type": "string", + "example": "admin" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "201": { + "description": "Rol asignado" + }, + "403": { + "description": "Sin permiso users.update" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + }, + "/users/{user}/app-roles/{clientId}/{role}": { + "delete": { + "tags": [ + "Users" + ], + "summary": "Quitarle a un usuario un rol dentro de una app (requiere users.update)", + "operationId": "60321b766e2a52bc435d7c93ed35a6dc", + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "clientId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "role", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Rol quitado" + }, + "403": { + "description": "Sin permiso users.update" + } + }, + "security": [ + { + "oauth2": [ + "users:write" + ] + } + ] + } + } + }, + "components": { + "schemas": { + "Client": { + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string", + "example": "Mi app Angular" + }, + "grant_types": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "authorization_code", + "refresh_token" + ] + }, + "redirect_uris": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "https://mi-app.com/callback" + ] + }, + "revoked": { + "type": "boolean" + } + }, + "type": "object" + }, + "User": { + "properties": { + "id": { + "type": "integer", + "example": 1 + }, + "name": { + "type": "string", + "example": "Ada Lovelace" + }, + "email": { + "type": "string", + "format": "email", + "example": "ada@example.com" + }, + "is_active": { + "type": "boolean", + "example": true + }, + "roles": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "user" + ] + }, + "app_roles": { + "description": "Roles del usuario específicos de la app que llama (el client_id del token usado).", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "editor" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "deleted_at": { + "description": "Solo presente para usuarios en la papelera (soft-deleted).", + "type": "string", + "format": "date-time", + "nullable": true + }, + "approved_at": { + "description": "Null = todavía no lo aprobó ningún admin (registro pendiente).", + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "type": "object" + } + }, + "securitySchemes": { + "oauth2": { + "type": "oauth2", + "description": "Servidor de autorización OAuth2 (Laravel Passport). Soporta Authorization Code + PKCE, Client Credentials y Password Grant.", + "flows": { + "authorizationCode": { + "authorizationUrl": "/oauth/authorize", + "tokenUrl": "/oauth/token", + "refreshUrl": "/oauth/token", + "scopes": { + "users:read": "Leer usuarios", + "users:write": "Crear, editar y borrar usuarios", + "account:read": "Leer tus clientes OAuth, tokens y apps autorizadas", + "account:write": "Gestionar tus clientes OAuth, tokens y apps autorizadas" + } + }, + "clientCredentials": { + "tokenUrl": "/oauth/token", + "scopes": { + "users:read": "Leer usuarios", + "users:write": "Crear, editar y borrar usuarios", + "account:read": "Leer tus clientes OAuth, tokens y apps autorizadas", + "account:write": "Gestionar tus clientes OAuth, tokens y apps autorizadas" + } + }, + "password": { + "tokenUrl": "/oauth/token", + "scopes": { + "users:read": "Leer usuarios", + "users:write": "Crear, editar y borrar usuarios", + "account:read": "Leer tus clientes OAuth, tokens y apps autorizadas", + "account:write": "Gestionar tus clientes OAuth, tokens y apps autorizadas" + } + } + } + } + } + }, + "tags": [ + { + "name": "Analytics", + "description": "Analytics" + }, + { + "name": "Users", + "description": "Users" + }, + { + "name": "Account", + "description": "Account" + } + ] +} \ No newline at end of file diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 0000000..fedb287 --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,4 @@ +* +!private/ +!public/ +!.gitignore diff --git a/storage/app/private/.gitignore b/storage/app/private/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/private/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 0000000..05c4471 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100644 index 0000000..01e4a6c --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..8364a84 --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,19 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..fe1ffc2 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..911f220 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "noEmit": true, + "strict": true + }, + "include": ["resources/js/**/*.ts", "resources/js/**/*.vue", "resources/js/**/*.d.ts"], + "exclude": ["node_modules", "public", "vendor"] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..a9dd1d8 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "extends": "@vue/tsconfig/tsconfig.json", + "compilerOptions": { + "composite": true, + "types": ["node"], + "module": "ESNext", + "moduleResolution": "Bundler" + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..0405eee --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; +import { bunny } from 'laravel-vite-plugin/fonts'; +import vue from '@vitejs/plugin-vue'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/scss/app.scss', 'resources/js/app.ts'], + refresh: true, + fonts: [ + bunny('Instrument Sans', { + weights: [400, 500, 600], + }), + ], + }), + vue(), + ], + server: { + watch: { + ignored: ['**/storage/framework/views/**'], + }, + }, +});