diff --git a/.env.example b/.env.example index 3a913ec..0d665f6 100644 --- a/.env.example +++ b/.env.example @@ -79,6 +79,10 @@ WORKERMAN_TIMEOUT=60 # ---- 附件 S3 兼容存储(R2 / COS / OSS / MinIO),不配置则回退本地 public ---- UPLOAD_DISK=uploads +# New uploads/covers use xpier media library (keep sablog Spatie attachments as fallback) +MEDIA_DISK=public +MEDIA_DIRECTORY=media +MEDIA_VISIBILITY=public S3_ACCESS_KEY= S3_SECRET_KEY= S3_REGION=auto diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ecfcb8a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +## 2026-09-16 + +- Switched new attachments/covers to `xpier/filament-media-library`. +- Markdown body now inserts `![alt](media:ID)` (files: `[name](media:ID)`); URLs are resolved at render time. Legacy sablog attach tokens are unchanged. +- Schema snapshot: `docs/database/mysql-schema-20260916-131822.sql`. + +## 2026-09-07 + +- Synced this repository from Gitea to local Herd for development (`http://laralog.test`). +- Local schema snapshot: `docs/database/schema-20260907-223917.sql`. diff --git a/Fetures.md b/Fetures.md new file mode 100644 index 0000000..7a8578b --- /dev/null +++ b/Fetures.md @@ -0,0 +1,21 @@ +# LaraLog Features + +Modern blog migrated from SaBlog-X: Filament admin, themes, plugins, sablog import, S3 attachments, Workerman AI queue. + +## Local development + +- Site: http://laralog.test +- Admin: http://laralog.test/admin +- Account: `admin@laralog.test` / `password` +- Database: MySQL `laralog` (Herd, root / empty password) +- Remote: `git@gitea.neatcn.com:gouki/laralog.git` + +See `README.md` and `docs/` for install, import, plugins, and themes. + +## Media library (xpier) + +- Package: `xpier/filament-media-library` (admin Media Library + MediaPicker). +- **Markdown body must store `![alt](media:ID)` or `[name](media:ID)`**, never a CDN/object-storage URL. HTML uses `[media=ID]`. +- Insert flow: pick a file → **Insert into body**. Cover uses `cover_media_id`. +- Legacy sablog `[attach=ID]` / `{{attach:ID}}` still render from Spatie media. +- Details: `docs/media.md`. diff --git a/README.md b/README.md index 4cb1eb9..e2fa48f 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,17 @@ ## 技术栈 -| 组件 | 版本 | 说明 | -|------|------|------| -| Laravel | ^12.0 | 应用框架 | -| Filament | ^5.7 | 后台面板(zh_CN) | -| Livewire | ^4.4 | 前台交互 | -| Workerman | ^5.2 | 常驻进程:队列消费者 + WebSocket 进度推送 | -| yansongda/pay | ^3.7 | 支付宝 / 微信支付 | -| spatie 库 | — | permission / medialibrary / sitemap / robots / tags / backup | -| league/commonmark | ^2.9 | Markdown 渲染(GFM) | -| league/html-to-markdown | ^5.1 | 老 HTML 内容转换 | -| MySQL | 8.x | 数据库 | +| 组件 | 版本 | 说明 | +| ----------------------- | ----- | ------------------------------------------------------------ | +| Laravel | ^12.0 | 应用框架 | +| Filament | ^5.7 | 后台面板(zh_CN) | +| Livewire | ^4.4 | 前台交互 | +| Workerman | ^5.2 | 常驻进程:队列消费者 + WebSocket 进度推送 | +| yansongda/pay | ^3.7 | 支付宝 / 微信支付 | +| spatie 库 | — | permission / medialibrary / sitemap / robots / tags / backup | +| league/commonmark | ^2.9 | Markdown 渲染(GFM) | +| league/html-to-markdown | ^5.1 | 老 HTML 内容转换 | +| MySQL | 8.x | 数据库 | ## 快速开始 @@ -74,8 +74,8 @@ S3_ACCESS_KEY=... S3_BUCKET=... S3_ENDPOINT=... php artisan attachments:sync-s3 - 目录:`plugins/{vendor}.{name}/`,含 `plugin.json` + `src/ServiceProvider.php`(继承 `App\Blog\Support\PluginServiceProvider`)+ 可选 `database/migrations`、`routes/web.php`、`views/` - 钩子:`addAction(hook, cb)` / `addFilter(hook, cb, priority)`,核心钩子: - - `comment.created`(AI 审核)、`payment.paid`(按 payable 分发订阅激活/解锁)、`post.rendered`(付费内容过滤/paywall)、`seo.structured_data` - - `filament.post_form` / `filament.post_table`(后台文章表单/表格注入) + - `comment.created`(AI 审核)、`payment.paid`(按 payable 分发订阅激活/解锁)、`post.rendered`(付费内容过滤/paywall)、`seo.structured_data` + - `filament.post_form` / `filament.post_table`(后台文章表单/表格注入) - 插件依赖 `requires` 强制校验:启用需依赖已启用,停用/卸载会被依赖者阻止;启动时依赖不满足的插件跳过 - 订单商品化:`Payment` 多态 `payable` 关联购买实体,实体实现 `payableLabel()` / `payableUrl()` 接入订单展示(详见 docs/plugins.md) - 后台「插件管理」:启停 / 上传 ZIP 安装 / 卸载 / 市场拉取(配置 `MARKET_URL` 后可用) @@ -85,7 +85,7 @@ S3_ACCESS_KEY=... S3_BUCKET=... S3_ENDPOINT=... php artisan attachments:sync-s3 - 每篇文章有 `content_format`(markdown / html),新文章默认 Markdown - 老数据导入标记为 html 原样保留;`content:convert` 批量转 Markdown -- 附件短代码:HTML 内容用 `[attach=1]` / `[img=1]`,Markdown 内容用 `{{attach:1}}` / `{{img:1}}`(`[]` 是 Markdown 保留字符),渲染时统一解析 +- 附件短代码:新图 `![alt](media:ID)` / `[name](media:ID)`;HTML `[media=ID]`。老附件 HTML `[attach=1]` / `[img=1]`,Markdown `{{attach:1}}` / `{{img:1}}`。不要把 CDN 地址写进正文(见 [docs/media.md](docs/media.md))。 - 付费内容:`[paid]...[/paid]` 短代码,非会员/未解锁访客隐藏(会员插件) ## 异步处理(Workerman) @@ -98,8 +98,8 @@ php artisan workerman:serve stop - 消费者复用 Laravel `Queue\Worker`,**database / redis 队列统一支持**,常驻进程内框架只启动一次(省去每个任务的启动开销) - 任务统一实现 `App\Blog\Jobs\AiJob` 接口(`handle(LlmClient)`),依赖由容器自动注入 - 队列选择: - - database(默认):`WORKERMAN_QUEUE_CONNECTION=database` - - redis:`WORKERMAN_QUEUE_CONNECTION=redis` 并确保 `QUEUE_CONNECTION=redis`、`REDIS_*` 配置正确;`redis` 连接的 `block_for` 建议设为 `0`(配合 1s 轮询,避免阻塞 Workerman event loop) + - database(默认):`WORKERMAN_QUEUE_CONNECTION=database` + - redis:`WORKERMAN_QUEUE_CONNECTION=redis` 并确保 `QUEUE_CONNECTION=redis`、`REDIS_*` 配置正确;`redis` 连接的 `block_for` 建议设为 `0`(配合 1s 轮询,避免阻塞 Workerman event loop) - 消费队列:`WORKERMAN_QUEUES=default,ai`(ai 队列为 AI 审核/润色任务) - 失败重试:`WORKERMAN_MAX_TRIES`(默认 3),超时 `WORKERMAN_TIMEOUT`(默认 60s),重试耗尽进 `failed_jobs` 表 - 降级路径:`php artisan queue:work` 照常可用(同一队列) @@ -107,6 +107,7 @@ php artisan workerman:serve stop ## 外链中转(/go,内置插件) 内置插件 `neatstudio.link-tracker`(外链中转): + - 正文外链、评论正文 URL、评论作者网址、友链统一改写为 `/go/{hash}`:302 跳转 + **点击统计**、可**停用拦截**(返回 410)、隐藏真实链接、为未来广告位预留 - 站内链接/相对路径/mailto/tel/锚点不中转;同一 URL 复用同一短码 - 后台「管理 → 外链中转」可查看点击量、启停、删除 @@ -128,25 +129,27 @@ php artisan workerman:serve stop ## 测试 ```bash -php artisan test # 84 个用例:迁移/老路由 301/主题/插件/会员支付流/AI 审核/商城购买 +php artisan test # Feature + Unit: import, legacy URLs, themes, plugins, membership, media:ID render ``` ## 开发者文档 -| 文档 | 内容 | -|------|------| -| [docs/install.md](docs/install.md) | 安装指南(环境/配置/验收清单) | -| [docs/import.md](docs/import.md) | Sablog 老数据导入(命令/映射/附件/301 兼容) | -| [docs/deploy.md](docs/deploy.md) | 部署(nginx/systemd/workerman/cron/上线清单) | -| [docs/development.md](docs/development.md) | 开发规范(代码/插件/主题/队列/测试/提交) | -| [docs/tutorial-plugin.md](docs/tutorial-plugin.md) | 插件开发教程(10 分钟上手,配套 demo) | -| [docs/tutorial-theme.md](docs/tutorial-theme.md) | 主题开发教程(10 分钟上手,配套 demo) | -| [docs/plugins.md](docs/plugins.md) | 插件 API 详解(钩子/依赖/商品化/市场契约) | -| [docs/themes.md](docs/themes.md) | 主题 API 详解(视图解析/注入点/变量) | -| [docs/architecture.md](docs/architecture.md) | 架构与设计决策 | -| [docs/api.md](docs/api.md) | 对外 API(小程序/第三方) | +| 文档 | 内容 | +| -------------------------------------------------- | --------------------------------------------- | +| [docs/install.md](docs/install.md) | 安装指南(环境/配置/验收清单) | +| [docs/import.md](docs/import.md) | Sablog 老数据导入(命令/映射/附件/301 兼容) | +| [docs/deploy.md](docs/deploy.md) | 部署(nginx/systemd/workerman/cron/上线清单) | +| [docs/development.md](docs/development.md) | 开发规范(代码/插件/主题/队列/测试/提交) | +| [docs/tutorial-plugin.md](docs/tutorial-plugin.md) | 插件开发教程(10 分钟上手,配套 demo) | +| [docs/tutorial-theme.md](docs/tutorial-theme.md) | 主题开发教程(10 分钟上手,配套 demo) | +| [docs/plugins.md](docs/plugins.md) | 插件 API 详解(钩子/依赖/商品化/市场契约) | +| [docs/themes.md](docs/themes.md) | 主题 API 详解(视图解析/注入点/变量) | +| [docs/architecture.md](docs/architecture.md) | 架构与设计决策 | +| [docs/media.md](docs/media.md) | Media library + Markdown `media:ID` | +| [docs/api.md](docs/api.md) | 对外 API(小程序/第三方) | **上手示例**: + - 插件:`plugins/demo.hello-world/`(短代码 / 钩子 / 路由 / 后台页 / 迁移 / 表单注入,全演示) - 主题:`themes/demo/`(最小可运行主题,绿色系,覆盖 partials 即可换肤) diff --git a/app/Blog/Services/PostContentRenderer.php b/app/Blog/Services/PostContentRenderer.php index 55479ba..d37a393 100644 --- a/app/Blog/Services/PostContentRenderer.php +++ b/app/Blog/Services/PostContentRenderer.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Blog\Services; +use App\Blog\Support\MarkdownMediaEmbed; use App\Models\Post; use Illuminate\Support\Facades\Cache; use League\CommonMark\Environment\Environment; @@ -36,11 +37,15 @@ class PostContentRenderer */ public function render(Post $post): string { + $embed = app(MarkdownMediaEmbed::class); + $raw = (string) $post->content; + $content = $post->content_format === 'markdown' - ? $this->toHtml($post->content) - : $post->content; + ? $this->toHtml($embed->expandMarkdown($raw)) + : $raw; $html = $this->renderShortcodes($content, $post); + $html = $embed->hydrateHtml($html); // 插件钩子:付费内容过滤、AI 处理等 $html = app(\App\Blog\Support\PluginManager::class)->applyFilters('post.rendered', $html, $post); diff --git a/app/Blog/Support/MarkdownMediaEmbed.php b/app/Blog/Support/MarkdownMediaEmbed.php new file mode 100644 index 0000000..89424b8 --- /dev/null +++ b/app/Blog/Support/MarkdownMediaEmbed.php @@ -0,0 +1,131 @@ +getKey(); + $isImage = $this->isImage($media); + + if ($format === 'html') { + return '[media='.$id.']'; + } + + $label = $this->escapeMdLabel($this->label($media, $isImage)); + + return $isImage + ? '!['.$label.']('.self::PROTOCOL.$id.')' + : '['.$label.']('.self::PROTOCOL.$id.')'; + } + + public function expandMarkdown(string $markdown): string + { + return preg_replace_callback( + '/\]\(media:(\d+)\)/i', + function (array $matches): string { + $url = $this->publicUrl((int) $matches[1]); + + return $url !== null ? ']('.$url.')' : $matches[0]; + }, + $markdown + ) ?? $markdown; + } + + public function hydrateHtml(string $html): string + { + $html = preg_replace_callback( + '/\b(src|href)=([\'"])media:(\d+)\2/i', + function (array $matches): string { + $url = $this->publicUrl((int) $matches[3]); + if ($url === null) { + return $matches[0]; + } + + return $matches[1].'='.$matches[2].$url.$matches[2]; + }, + $html + ) ?? $html; + + return preg_replace_callback( + '/\[media=(\d+)\]/i', + function (array $matches): string { + $id = (int) $matches[1]; + $media = $this->find($id); + $url = $this->publicUrl($id); + + if ($url === null) { + return ''; + } + + if ($media && $this->isImage($media)) { + return sprintf( + '%s', + e($url), + e($this->label($media, true)) + ); + } + + $label = $media ? $this->label($media, false) : 'file-'.$id; + + return sprintf('%s', e($url), e($label)); + }, + $html + ) ?? $html; + } + + public function find(int $id): ?MediaLibrary + { + try { + return MediaLibrary::query()->find($id); + } catch (\Throwable) { + return null; + } + } + + public function publicUrl(int $id): ?string + { + $media = $this->find($id); + $url = $media?->url; + + return filled($url) ? (string) $url : null; + } + + public function isImage(MediaLibrary $media): bool + { + if ($media->type === MediaLibrary::TYPE_IMAGE) { + return true; + } + + return is_string($media->mime_type) && str_starts_with($media->mime_type, 'image/'); + } + + protected function label(MediaLibrary $media, bool $isImage): string + { + if (filled($media->alt_text)) { + return (string) $media->alt_text; + } + + $name = (string) ($media->original_name ?: basename((string) $media->path) ?: 'media-'.$media->getKey()); + + return $isImage ? (pathinfo($name, PATHINFO_FILENAME) ?: $name) : $name; + } + + protected function escapeMdLabel(string $label): string + { + return str_replace(['[', ']', '!'], ['\\[', '\\]', '\\!'], $label); + } +} diff --git a/app/Filament/Resources/Categories/Schemas/CategoryForm.php b/app/Filament/Resources/Categories/Schemas/CategoryForm.php index 6abd2fc..6cc29fe 100644 --- a/app/Filament/Resources/Categories/Schemas/CategoryForm.php +++ b/app/Filament/Resources/Categories/Schemas/CategoryForm.php @@ -4,12 +4,11 @@ declare(strict_types=1); namespace App\Filament\Resources\Categories\Schemas; -use App\Support\MediaDisk; -use Filament\Forms\Components\SpatieMediaLibraryFileUpload; use Filament\Forms\Components\Textarea; use Filament\Forms\Components\TextInput; use Filament\Schemas\Components\Section; use Filament\Schemas\Schema; +use Xpier\FilamentMediaLibrary\Components\MediaPicker; class CategoryForm { @@ -43,12 +42,11 @@ class CategoryForm ]), Section::make('封面') ->schema([ - SpatieMediaLibraryFileUpload::make('cover') + MediaPicker::make('cover_media_id') ->label('封面图') - ->collection('cover') - ->image() - ->imageEditor() - ->disk(MediaDisk::name()), + ->module('articles') + ->mediaType('image') + ->relationship('coverMedia'), ]), ]); } diff --git a/app/Filament/Resources/Media/MediaResource.php b/app/Filament/Resources/Media/MediaResource.php index c6caf9a..3471ac9 100644 --- a/app/Filament/Resources/Media/MediaResource.php +++ b/app/Filament/Resources/Media/MediaResource.php @@ -27,6 +27,11 @@ class MediaResource extends Resource protected static ?string $pluralModelLabel = '媒体'; + public static function shouldRegisterNavigation(): bool + { + return false; + } + protected static ?string $model = Media::class; protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack; diff --git a/app/Filament/Resources/Posts/Schemas/PostForm.php b/app/Filament/Resources/Posts/Schemas/PostForm.php index 299766d..47521f8 100644 --- a/app/Filament/Resources/Posts/Schemas/PostForm.php +++ b/app/Filament/Resources/Posts/Schemas/PostForm.php @@ -2,18 +2,23 @@ declare(strict_types=1); - namespace App\Filament\Resources\Posts\Schemas; -use App\Support\MediaDisk; +use App\Blog\Support\MarkdownMediaEmbed; +use Filament\Actions\Action; use Filament\Forms\Components\DateTimePicker; use Filament\Forms\Components\MarkdownEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Toggle; +use Filament\Notifications\Notification; +use Filament\Schemas\Components\Actions; +use Filament\Schemas\Components\Utilities\Get; +use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Schema; -use Filament\Forms\Components\SpatieMediaLibraryFileUpload; +use Xpier\FilamentMediaLibrary\Components\MediaPicker; +use Xpier\FilamentMediaLibrary\Models\MediaLibrary; class PostForm { @@ -39,7 +44,8 @@ class PostForm 'markdown' => 'Markdown', 'html' => 'HTML', ]) - ->default('markdown'), + ->default('markdown') + ->live(), Select::make('status') ->label('状态') ->options([ @@ -51,17 +57,49 @@ class PostForm MarkdownEditor::make('content') ->label('正文') ->required() + ->helperText('Markdown 插入图片用 ![说明](media:ID),文件用 [文件名](media:ID)。不要把 CDN / 对象存储地址写进正文。') + ->fileAttachments(false) ->columnSpanFull(), + MediaPicker::make('insert_media_id') + ->label('从媒体库插入正文') + ->module('articles') + ->mediaType(null) + ->dehydrated(false) + ->helperText('选好媒体后点「插入到正文」。Markdown 写入 media:ID 引用,渲染时再换成真实地址。') + ->columnSpanFull(), + Actions::make([ + Action::make('insertSelectedMedia') + ->label('插入到正文') + ->action(function (Get $get, Set $set): void { + $mediaId = $get('insert_media_id'); + $media = is_numeric($mediaId) + ? MediaLibrary::query()->find((int) $mediaId) + : null; + + if (! $media instanceof MediaLibrary) { + Notification::make()->title('请先从媒体库选择文件')->warning()->send(); + + return; + } + + $snippet = app(MarkdownMediaEmbed::class)->snippet( + $media, + (string) ($get('content_format') ?: 'markdown') + ); + $set('content', rtrim((string) $get('content'))."\n\n".$snippet."\n"); + $set('insert_media_id', null); + Notification::make()->title('已写入正文引用')->success()->send(); + }), + ])->columnSpanFull(), ]), \Filament\Schemas\Components\Section::make('封面与摘要') ->columns(2) ->schema([ - SpatieMediaLibraryFileUpload::make('cover') + MediaPicker::make('cover_media_id') ->label('封面图') - ->collection('cover') - ->image() - ->imageEditor() - ->disk(MediaDisk::name()) + ->module('articles') + ->mediaType('image') + ->relationship('coverMedia') ->columnSpanFull(), Textarea::make('excerpt') ->label('摘要(留空自动截取)') diff --git a/app/Models/Category.php b/app/Models/Category.php index 60db3ef..74b89c6 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -6,8 +6,10 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Spatie\MediaLibrary\HasMedia; +use Xpier\FilamentMediaLibrary\Models\MediaLibrary; use Spatie\MediaLibrary\InteractsWithMedia; class Category extends Model implements HasMedia @@ -21,6 +23,7 @@ class Category extends Model implements HasMedia 'display_order', 'post_count', 'description', + 'cover_media_id', ]; public function posts(): HasMany @@ -28,6 +31,21 @@ class Category extends Model implements HasMedia return $this->hasMany(Post::class); } + public function coverMedia(): BelongsTo + { + return $this->belongsTo(MediaLibrary::class, 'cover_media_id'); + } + + public function coverImageUrl(): ?string + { + $libraryUrl = $this->coverMedia?->url; + if (filled($libraryUrl)) { + return (string) $libraryUrl; + } + + return $this->getFirstMedia('cover')?->getUrl(); + } + public function getUrlAttribute(): string { return route('category.show', $this->slug ?? $this->id); diff --git a/app/Models/Post.php b/app/Models/Post.php index bc9cee7..ca3bbed 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Spatie\MediaLibrary\HasMedia; +use Xpier\FilamentMediaLibrary\Models\MediaLibrary; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\Tags\HasTags; @@ -30,6 +31,7 @@ class Post extends Model implements HasMedia 'content', 'content_format', 'keywords', + 'cover_media_id', 'status', 'is_sticky', 'close_comment', @@ -57,6 +59,26 @@ class Post extends Model implements HasMedia return $this->belongsTo(User::class, 'user_id'); } + public function coverMedia(): BelongsTo + { + return $this->belongsTo(MediaLibrary::class, 'cover_media_id'); + } + + public function coverImageUrl(?string $conversion = 'card'): ?string + { + $libraryUrl = $this->coverMedia?->url; + if (filled($libraryUrl)) { + return (string) $libraryUrl; + } + + $cover = $this->getFirstMedia('cover'); + if ($cover === null) { + return null; + } + + return $cover->getUrl($conversion) ?: $cover->getUrl(); + } + public function comments(): HasMany { return $this->hasMany(Comment::class); @@ -133,8 +155,10 @@ class Post extends Model implements HasMedia $text = strip_tags($this->content); // 付费块不进入摘要,避免付费内容泄漏到列表页/SEO meta - $text = preg_replace('/\[paid\].*?\[\/paid\]/s', '', $text); - $text = preg_replace('/\[[^\]]*\]/', '', $text); + $text = preg_replace('/\[paid\].*?\[\/paid\]/s', '', $text) ?? $text; + $text = preg_replace('/!\[([^\]]*)\]\((?:media|attach):\d+\)/i', '$1', $text) ?? $text; + $text = preg_replace('/\[([^\]]*)\]\((?:media|attach):\d+\)/i', '$1', $text) ?? $text; + $text = preg_replace('/\[[^\]]*\]/', '', $text) ?? $text; return mb_substr($text, 0, 200); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index b7ae945..931e539 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -41,6 +41,10 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { + config([ + 'filament-media-library.navigation_group' => '内容', + ]); + // 自动加载所有插件的迁移(插件目录下 database/migrations) foreach (glob(base_path('plugins/*/database/migrations')) ?: [] as $path) { $this->loadMigrationsFrom($path); diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index a2ae23a..0c986b6 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -28,6 +28,7 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; use Illuminate\Routing\Middleware\SubstituteBindings; use Illuminate\Session\Middleware\StartSession; use Illuminate\View\Middleware\ShareErrorsFromSession; +use Xpier\FilamentMediaLibrary\Filament\MediaLibraryPlugin; class AdminPanelProvider extends PanelProvider { @@ -98,6 +99,10 @@ class AdminPanelProvider extends PanelProvider ->widgets([ AccountWidget::class, ]) + ->plugins([ + MediaLibraryPlugin::make() + ->navigationGroup((string) config('filament-media-library.navigation_group', '内容')), + ]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, diff --git a/composer.json b/composer.json index 481ccc2..8cbf0b3 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,10 @@ "name": "laravel/laravel", "type": "project", "description": "The skeleton application for the Laravel framework.", - "keywords": ["laravel", "framework"], + "keywords": [ + "laravel", + "framework" + ], "license": "MIT", "require": { "php": "^8.2", @@ -23,6 +26,7 @@ "spatie/laravel-sitemap": "^8.0", "spatie/laravel-tags": "^4.0", "workerman/workerman": "^5.0", + "xpier/filament-media-library": "^1.5", "yansongda/pay": "^3.7" }, "require-dev": { @@ -104,5 +108,11 @@ } }, "minimum-stability": "stable", - "prefer-stable": true + "prefer-stable": true, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/ffqa/xpier-filament-media-library.git" + } + ] } diff --git a/composer.lock b/composer.lock index 5ad0484..9f00be3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,15 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "aaa7f930f1c6d7bbf959e9b5bcdac929", + "content-hash": "532b12fdd4360f462ea17c8697bbb06a", "packages": [ { "name": "anourvalar/eloquent-serialize", - "version": "1.3.11", - "source": { - "type": "git", - "url": "https://github.com/AnourValar/eloquent-serialize.git", - "reference": "abd890c4d1ad8e90dd454d01283fbf342f80f1e5" - }, + "version": "1.3.12", "dist": { "type": "zip", - "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/abd890c4d1ad8e90dd454d01283fbf342f80f1e5", - "reference": "abd890c4d1ad8e90dd454d01283fbf342f80f1e5", + "url": "https://mirrors.tencent.com/repository/composer/anourvalar/eloquent-serialize/1.3.12/anourvalar-eloquent-serialize-1.3.12.zip", + "reference": "eb46e698efe7e20c311f1f93830111fcdcdabd96", "shasum": "" }, "require": { @@ -45,7 +40,6 @@ "AnourValar\\EloquentSerialize\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -67,9 +61,9 @@ ], "support": { "issues": "https://github.com/AnourValar/eloquent-serialize/issues", - "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.11" + "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.12" }, - "time": "2026-08-07T06:14:19+00:00" + "time": "2026-09-13T06:25:37+00:00" }, { "name": "aws/aws-crt-php", @@ -225,14 +219,9 @@ { "name": "blade-ui-kit/blade-heroicons", "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/driesvints/blade-heroicons.git", - "reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/66fa8ba09dba12e0cdb410b8cb94f3b890eca440", + "url": "https://mirrors.tencent.com/repository/composer/blade-ui-kit/blade-heroicons/2.7.0/blade-ui-kit-blade-heroicons-2.7.0.zip", "reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440", "shasum": "" }, @@ -258,7 +247,6 @@ "BladeUI\\Heroicons\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -279,29 +267,14 @@ "issues": "https://github.com/driesvints/blade-heroicons/issues", "source": "https://github.com/driesvints/blade-heroicons/tree/2.7.0" }, - "funding": [ - { - "url": "https://github.com/sponsors/driesvints", - "type": "github" - }, - { - "url": "https://www.paypal.com/paypalme/driesvints", - "type": "paypal" - } - ], "time": "2026-03-16T13:00:23+00:00" }, { "name": "blade-ui-kit/blade-icons", "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/driesvints/blade-icons.git", - "reference": "6e072d021ea6249986c330b93293c33d0c4f0e34" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/6e072d021ea6249986c330b93293c33d0c4f0e34", + "url": "https://mirrors.tencent.com/repository/composer/blade-ui-kit/blade-icons/1.10.1/blade-ui-kit-blade-icons-1.10.1.zip", "reference": "6e072d021ea6249986c330b93293c33d0c4f0e34", "shasum": "" }, @@ -338,7 +311,6 @@ "BladeUI\\Icons\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -360,29 +332,14 @@ "issues": "https://github.com/driesvints/blade-icons/issues", "source": "https://github.com/driesvints/blade-icons" }, - "funding": [ - { - "url": "https://github.com/sponsors/driesvints", - "type": "github" - }, - { - "url": "https://www.paypal.com/paypalme/driesvints", - "type": "paypal" - } - ], "time": "2026-06-30T09:44:12+00:00" }, { "name": "brick/math", "version": "0.14.8", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "url": "https://mirrors.tencent.com/repository/composer/brick/math/0.14.8/brick-math-0.14.8.zip", "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", "shasum": "" }, @@ -400,7 +357,6 @@ "Brick\\Math\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -424,26 +380,15 @@ "issues": "https://github.com/brick/math/issues", "source": "https://github.com/brick/math/tree/0.14.8" }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], "time": "2026-02-10T14:33:43+00:00" }, { "name": "carbonphp/carbon-doctrine-types", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" - }, + "version": "3.2.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "url": "https://mirrors.tencent.com/repository/composer/carbonphp/carbon-doctrine-types/3.2.1/carbonphp-carbon-doctrine-types-3.2.1.zip", + "reference": "5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc", "shasum": "" }, "require": { @@ -458,12 +403,16 @@ "phpunit/phpunit": "^10.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -483,35 +432,16 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.1" }, - "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" + "time": "2026-09-06T14:11:38+00:00" }, { "name": "chillerlan/php-qrcode", "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "7b66282572fc14075c0507d74d9837dab25b38d6" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/7b66282572fc14075c0507d74d9837dab25b38d6", + "url": "https://mirrors.tencent.com/repository/composer/chillerlan/php-qrcode/5.0.5/chillerlan-php-qrcode-5.0.5.zip", "reference": "7b66282572fc14075c0507d74d9837dab25b38d6", "shasum": "" }, @@ -542,7 +472,6 @@ "chillerlan\\QRCode\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT", "Apache-2.0" @@ -586,25 +515,14 @@ "issues": "https://github.com/chillerlan/php-qrcode/issues", "source": "https://github.com/chillerlan/php-qrcode" }, - "funding": [ - { - "url": "https://ko-fi.com/codemasher", - "type": "Ko-Fi" - } - ], "time": "2025-11-23T23:51:44+00:00" }, { "name": "chillerlan/php-settings-container", "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/a0a487cbf5344f721eb504bf0f59bada40c381b7", + "url": "https://mirrors.tencent.com/repository/composer/chillerlan/php-settings-container/3.3.0/chillerlan-php-settings-container-3.3.0.zip", "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7", "shasum": "" }, @@ -627,7 +545,6 @@ "chillerlan\\Settings\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -651,16 +568,6 @@ "issues": "https://github.com/chillerlan/php-settings-container/issues", "source": "https://github.com/chillerlan/php-settings-container" }, - "funding": [ - { - "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", - "type": "custom" - }, - { - "url": "https://ko-fi.com/codemasher", - "type": "ko_fi" - } - ], "time": "2026-03-20T21:10:52+00:00" }, { @@ -743,14 +650,9 @@ { "name": "danharrin/date-format-converter", "version": "v0.3.1", - "source": { - "type": "git", - "url": "https://github.com/danharrin/date-format-converter.git", - "reference": "7c31171bc981e48726729a5f3a05a2d2b63f0b1e" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danharrin/date-format-converter/zipball/7c31171bc981e48726729a5f3a05a2d2b63f0b1e", + "url": "https://mirrors.tencent.com/repository/composer/danharrin/date-format-converter/v0.3.1/danharrin-date-format-converter-v0.3.1.zip", "reference": "7c31171bc981e48726729a5f3a05a2d2b63f0b1e", "shasum": "" }, @@ -767,7 +669,6 @@ "DanHarrin\\DateFormatConverter\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -783,25 +684,14 @@ "issues": "https://github.com/danharrin/date-format-converter/issues", "source": "https://github.com/danharrin/date-format-converter" }, - "funding": [ - { - "url": "https://github.com/danharrin", - "type": "github" - } - ], "time": "2024-06-13T09:38:44+00:00" }, { "name": "danharrin/livewire-rate-limiting", "version": "v2.2.1", - "source": { - "type": "git", - "url": "https://github.com/danharrin/livewire-rate-limiting.git", - "reference": "69436717dc70e30f80d7f8fd02504c22992a9ad5" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/69436717dc70e30f80d7f8fd02504c22992a9ad5", + "url": "https://mirrors.tencent.com/repository/composer/danharrin/livewire-rate-limiting/v2.2.1/danharrin-livewire-rate-limiting-v2.2.1.zip", "reference": "69436717dc70e30f80d7f8fd02504c22992a9ad5", "shasum": "" }, @@ -821,7 +711,6 @@ "DanHarrin\\LivewireRateLimiting\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -837,12 +726,6 @@ "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", "source": "https://github.com/danharrin/livewire-rate-limiting" }, - "funding": [ - { - "url": "https://github.com/danharrin", - "type": "github" - } - ], "time": "2026-08-06T08:41:51+00:00" }, { @@ -929,14 +812,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/dflydev/dot-access-data/v3.0.3/dflydev-dot-access-data-v3.0.3.zip", "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, @@ -961,7 +839,6 @@ "Dflydev\\DotAccessData\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1004,14 +881,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/doctrine/inflector/2.1.0/doctrine-inflector-2.1.0.zip", "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, @@ -1031,7 +903,6 @@ "Doctrine\\Inflector\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1075,33 +946,14 @@ "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", + "url": "https://mirrors.tencent.com/repository/composer/doctrine/lexer/3.0.1/doctrine-lexer-3.0.1.zip", "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, @@ -1121,7 +973,6 @@ "Doctrine\\Common\\Lexer\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1152,33 +1003,14 @@ "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", + "url": "https://mirrors.tencent.com/repository/composer/dragonmantank/cron-expression/v3.6.0/dragonmantank-cron-expression-v3.6.0.zip", "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", "shasum": "" }, @@ -1204,7 +1036,6 @@ "Cron\\": "src/Cron/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1224,25 +1055,14 @@ "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", + "url": "https://mirrors.tencent.com/repository/composer/egulias/email-validator/4.0.4/egulias-email-validator-4.0.4.zip", "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", "shasum": "" }, @@ -1269,7 +1089,6 @@ "Egulias\\EmailValidator\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1291,25 +1110,14 @@ "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": "filament/actions", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/actions.git", - "reference": "da3ed6cc03bd604b8b875ea03d4e9ef02c279eb2" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/da3ed6cc03bd604b8b875ea03d4e9ef02c279eb2", + "url": "https://mirrors.tencent.com/repository/composer/filament/actions/v5.7.6/filament-actions-v5.7.6.zip", "reference": "da3ed6cc03bd604b8b875ea03d4e9ef02c279eb2", "shasum": "" }, @@ -1336,7 +1144,6 @@ "Filament\\Actions\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1351,14 +1158,9 @@ { "name": "filament/filament", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/panels.git", - "reference": "7e75d8da9b907ead7d618ce8237228316d08ae43" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/7e75d8da9b907ead7d618ce8237228316d08ae43", + "url": "https://mirrors.tencent.com/repository/composer/filament/filament/v5.7.6/filament-filament-v5.7.6.zip", "reference": "7e75d8da9b907ead7d618ce8237228316d08ae43", "shasum": "" }, @@ -1393,7 +1195,6 @@ "Filament\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1408,14 +1209,9 @@ { "name": "filament/forms", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/forms.git", - "reference": "3295b3acfe81dc75faa3a6dbbfea551e4df10887" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/3295b3acfe81dc75faa3a6dbbfea551e4df10887", + "url": "https://mirrors.tencent.com/repository/composer/filament/forms/v5.7.6/filament-forms-v5.7.6.zip", "reference": "3295b3acfe81dc75faa3a6dbbfea551e4df10887", "shasum": "" }, @@ -1443,7 +1239,6 @@ "Filament\\Forms\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1458,14 +1253,9 @@ { "name": "filament/infolists", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/infolists.git", - "reference": "dca2f115006b716f2293e29042f9c9b410fc3548" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/dca2f115006b716f2293e29042f9c9b410fc3548", + "url": "https://mirrors.tencent.com/repository/composer/filament/infolists/v5.7.6/filament-infolists-v5.7.6.zip", "reference": "dca2f115006b716f2293e29042f9c9b410fc3548", "shasum": "" }, @@ -1488,7 +1278,6 @@ "Filament\\Infolists\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1503,14 +1292,9 @@ { "name": "filament/notifications", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/notifications.git", - "reference": "f188823f2e681883e1fa419af7e2f2a17d4c63c5" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/f188823f2e681883e1fa419af7e2f2a17d4c63c5", + "url": "https://mirrors.tencent.com/repository/composer/filament/notifications/v5.7.6/filament-notifications-v5.7.6.zip", "reference": "f188823f2e681883e1fa419af7e2f2a17d4c63c5", "shasum": "" }, @@ -1535,7 +1319,6 @@ "Filament\\Notifications\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1550,14 +1333,9 @@ { "name": "filament/query-builder", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/query-builder.git", - "reference": "d658205b135ef364c992f5d5d518e9463099aab4" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/d658205b135ef364c992f5d5d518e9463099aab4", + "url": "https://mirrors.tencent.com/repository/composer/filament/query-builder/v5.7.6/filament-query-builder-v5.7.6.zip", "reference": "d658205b135ef364c992f5d5d518e9463099aab4", "shasum": "" }, @@ -1581,7 +1359,6 @@ "Filament\\QueryBuilder\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1596,14 +1373,9 @@ { "name": "filament/schemas", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/schemas.git", - "reference": "3e191f49090645685a34560f5a3e1ba28ed3e7bc" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/schemas/zipball/3e191f49090645685a34560f5a3e1ba28ed3e7bc", + "url": "https://mirrors.tencent.com/repository/composer/filament/schemas/v5.7.6/filament-schemas-v5.7.6.zip", "reference": "3e191f49090645685a34560f5a3e1ba28ed3e7bc", "shasum": "" }, @@ -1626,7 +1398,6 @@ "Filament\\Schemas\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1678,14 +1449,9 @@ { "name": "filament/support", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/support.git", - "reference": "b6a33dd2af46160abe73226d671b1bc490a84a27" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/b6a33dd2af46160abe73226d671b1bc490a84a27", + "url": "https://mirrors.tencent.com/repository/composer/filament/support/v5.7.6/filament-support-v5.7.6.zip", "reference": "b6a33dd2af46160abe73226d671b1bc490a84a27", "shasum": "" }, @@ -1721,7 +1487,6 @@ "Filament\\Support\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1736,14 +1501,9 @@ { "name": "filament/tables", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/tables.git", - "reference": "be471ed4a9f2e7dcbbb134db622a03d4e89f7a21" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/be471ed4a9f2e7dcbbb134db622a03d4e89f7a21", + "url": "https://mirrors.tencent.com/repository/composer/filament/tables/v5.7.6/filament-tables-v5.7.6.zip", "reference": "be471ed4a9f2e7dcbbb134db622a03d4e89f7a21", "shasum": "" }, @@ -1767,7 +1527,6 @@ "Filament\\Tables\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1782,14 +1541,9 @@ { "name": "filament/widgets", "version": "v5.7.6", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/widgets.git", - "reference": "e500c98debe26112008398933fcf3ed50ee103f7" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/e500c98debe26112008398933fcf3ed50ee103f7", + "url": "https://mirrors.tencent.com/repository/composer/filament/widgets/v5.7.6/filament-widgets-v5.7.6.zip", "reference": "e500c98debe26112008398933fcf3ed50ee103f7", "shasum": "" }, @@ -1811,7 +1565,6 @@ "Filament\\Widgets\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1826,14 +1579,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/fruitcake/php-cors/v1.4.0/fruitcake-php-cors-v1.4.0.zip", "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", "shasum": "" }, @@ -1857,7 +1605,6 @@ "Fruitcake\\Cors\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1882,38 +1629,23 @@ "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" - }, + "version": "v1.2.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", - "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "url": "https://mirrors.tencent.com/repository/composer/graham-campbell/result-type/v1.2.0/graham-campbell-result-type-v1.2.0.zip", + "reference": "adccca3324eece92ca35463648c12b9e6293c05b", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.5" + "phpoption/phpoption": "^1.10" }, "require-dev": { - "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + "phpunit/phpunit": "^8.5.52 || ^9.6.34 || ^10.5.63 || ^11.5.55 || ^12.5.14" }, "type": "library", "autoload": { @@ -1921,7 +1653,6 @@ "GrahamCampbell\\ResultType\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1942,38 +1673,23 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.2.0" }, - "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" + "time": "2026-08-24T09:06:52+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.15.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc" - }, + "version": "7.15.5", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc", - "reference": "ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc", + "url": "https://mirrors.tencent.com/repository/composer/guzzlehttp/guzzle/7.15.5/guzzlehttp-guzzle-7.15.5.zip", + "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.5.2", - "guzzlehttp/psr7": "^2.13", + "guzzlehttp/promises": "^2.5.3", + "guzzlehttp/psr7": "^2.13.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -2011,7 +1727,6 @@ "GuzzleHttp\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2066,36 +1781,17 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.15.3" + "source": "https://github.com/guzzle/guzzle/tree/7.15.5" }, - "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-08-05T19:48:21+00:00" + "time": "2026-08-24T09:21:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.5.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "2823687acff28b2dbe67b2508a6b300e2c3fa4ce" - }, + "version": "2.5.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/2823687acff28b2dbe67b2508a6b300e2c3fa4ce", - "reference": "2823687acff28b2dbe67b2508a6b300e2c3fa4ce", + "url": "https://mirrors.tencent.com/repository/composer/guzzlehttp/promises/2.5.3/guzzlehttp-promises-2.5.3.zip", + "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1", "shasum": "" }, "require": { @@ -2118,7 +1814,6 @@ "GuzzleHttp\\Promise\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2150,36 +1845,17 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.5.2" + "source": "https://github.com/guzzle/promises/tree/2.5.3" }, - "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-08-05T19:30:54+00:00" + "time": "2026-08-24T09:11:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.13.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4" - }, + "version": "2.13.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dad89620b7a6edb60c15858442eb2e408b45d8f4", - "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4", + "url": "https://mirrors.tencent.com/repository/composer/guzzlehttp/psr7/2.13.1/guzzlehttp-psr7-2.13.1.zip", + "reference": "95e7828100de18b4e269fb1703be530082d5166d", "shasum": "" }, "require": { @@ -2215,7 +1891,6 @@ "GuzzleHttp\\Psr7\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2269,36 +1944,17 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.13.0" + "source": "https://github.com/guzzle/psr7/tree/2.13.1" }, - "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" + "time": "2026-08-24T09:13:11+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.10", - "source": { - "type": "git", - "url": "https://github.com/guzzle/uri-template.git", - "reference": "f6c24c21f42b990e9a58912b332d0874df6ba839" - }, + "version": "v1.0.11", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/f6c24c21f42b990e9a58912b332d0874df6ba839", - "reference": "f6c24c21f42b990e9a58912b332d0874df6ba839", + "url": "https://mirrors.tencent.com/repository/composer/guzzlehttp/uri-template/v1.0.11/guzzlehttp-uri-template-v1.0.11.zip", + "reference": "d0058dccf4299d70c3d9da3378b8908b32780368", "shasum": "" }, "require": { @@ -2322,7 +1978,6 @@ "GuzzleHttp\\UriTemplate\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2355,35 +2010,16 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.10" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.11" }, - "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" + "time": "2026-08-24T09:15:32+00:00" }, { "name": "kirschbaum-development/eloquent-power-joins", "version": "4.3.3", - "source": { - "type": "git", - "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", - "reference": "c609dbbe4ad2051b667e937f1ab554067519d64b" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/c609dbbe4ad2051b667e937f1ab554067519d64b", + "url": "https://mirrors.tencent.com/repository/composer/kirschbaum-development/eloquent-power-joins/4.3.3/kirschbaum-development-eloquent-power-joins-4.3.3.zip", "reference": "c609dbbe4ad2051b667e937f1ab554067519d64b", "shasum": "" }, @@ -2411,7 +2047,6 @@ "Kirschbaum\\PowerJoins\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2438,16 +2073,11 @@ }, { "name": "laravel/framework", - "version": "v12.65.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "99a8fb3153f962a323377d6742be08da86bcccb8" - }, + "version": "v12.69.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/99a8fb3153f962a323377d6742be08da86bcccb8", - "reference": "99a8fb3153f962a323377d6742be08da86bcccb8", + "url": "https://mirrors.tencent.com/repository/composer/laravel/framework/v12.69.2/laravel-framework-v12.69.2.zip", + "reference": "17d034ef1e209b63a1d3a89c90ce5e89a4eb3fc5", "shasum": "" }, "require": { @@ -2636,7 +2266,6 @@ ] } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2656,20 +2285,15 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-08-05T15:33:16+00:00" + "time": "2026-09-08T14:29:09+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.22", - "source": { - "type": "git", - "url": "https://github.com/laravel/prompts.git", - "reference": "02b89b39e8972a998db4d5d4ad4719239dd4aee4" - }, + "version": "v0.3.24", "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/02b89b39e8972a998db4d5d4ad4719239dd4aee4", - "reference": "02b89b39e8972a998db4d5d4ad4719239dd4aee4", + "url": "https://mirrors.tencent.com/repository/composer/laravel/prompts/v0.3.24/laravel-prompts-v0.3.24.zip", + "reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b", "shasum": "" }, "require": { @@ -2706,16 +2330,15 @@ "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.22" + "source": "https://github.com/laravel/prompts/tree/v0.3.24" }, - "time": "2026-08-04T14:50:50+00:00" + "time": "2026-08-20T12:55:36+00:00" }, { "name": "laravel/sanctum", @@ -2782,16 +2405,11 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.15", - "source": { - "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" - }, + "version": "v2.0.16", "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", - "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", + "url": "https://mirrors.tencent.com/repository/composer/laravel/serializable-closure/v2.0.16/laravel-serializable-closure-v2.0.16.zip", + "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", "shasum": "" }, "require": { @@ -2815,7 +2433,6 @@ "Laravel\\SerializableClosure\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2839,7 +2456,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-07-21T16:49:22+00:00" + "time": "2026-08-18T20:28:54+00:00" }, { "name": "laravel/tinker", @@ -2909,16 +2526,11 @@ }, { "name": "league/commonmark", - "version": "2.9.2", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "72e9a87efcf41a8e83be3ed0866b69d77565cb12" - }, + "version": "2.10.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/72e9a87efcf41a8e83be3ed0866b69d77565cb12", - "reference": "72e9a87efcf41a8e83be3ed0866b69d77565cb12", + "url": "https://mirrors.tencent.com/repository/composer/league/commonmark/2.10.1/league-commonmark-2.10.1.zip", + "reference": "9d489ab67a02960fd8ffe624d93f751daf95439e", "shasum": "" }, "require": { @@ -2955,7 +2567,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.10-dev" + "dev-main": "2.11-dev" } }, "autoload": { @@ -2963,7 +2575,6 @@ "League\\CommonMark\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2994,37 +2605,14 @@ "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-08-11T00:58:45+00:00" + "time": "2026-09-07T13:44:26+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", + "url": "https://mirrors.tencent.com/repository/composer/league/config/v1.2.0/league-config-v1.2.0.zip", "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, @@ -3051,7 +2639,6 @@ "League\\Config\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3080,33 +2667,14 @@ "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/csv", "version": "9.28.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/csv.git", - "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/6582ace29ae09ba5b07049d40ea13eb19c8b5073", + "url": "https://mirrors.tencent.com/repository/composer/league/csv/9.28.0/league-csv-9.28.0.zip", "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073", "shasum": "" }, @@ -3149,7 +2717,6 @@ "League\\Csv\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3179,26 +2746,15 @@ "rss": "https://github.com/thephpleague/csv/releases.atom", "source": "https://github.com/thephpleague/csv" }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], "time": "2025-12-27T15:18:42+00:00" }, { "name": "league/flysystem", - "version": "3.35.2", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "b277b5dc3d56650b68904117124e79c851e12376" - }, + "version": "3.36.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b277b5dc3d56650b68904117124e79c851e12376", - "reference": "b277b5dc3d56650b68904117124e79c851e12376", + "url": "https://mirrors.tencent.com/repository/composer/league/flysystem/3.36.0/league-flysystem-3.36.0.zip", + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25", "shasum": "" }, "require": { @@ -3240,7 +2796,6 @@ "League\\Flysystem\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3266,9 +2821,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.35.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.36.0" }, - "time": "2026-07-06T14:42:07+00:00" + "time": "2026-09-02T08:00:27+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -3327,16 +2882,11 @@ }, { "name": "league/flysystem-local", - "version": "3.31.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" - }, + "version": "3.35.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", - "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "url": "https://mirrors.tencent.com/repository/composer/league/flysystem-local/3.35.3/league-flysystem-local-3.35.3.zip", + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4", "shasum": "" }, "require": { @@ -3351,7 +2901,6 @@ "League\\Flysystem\\Local\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3370,9 +2919,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.35.3" }, - "time": "2026-01-23T15:30:45+00:00" + "time": "2026-08-12T13:29:21+00:00" }, { "name": "league/html-to-markdown", @@ -3466,14 +3015,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/league/mime-type-detection/1.17.0/league-mime-type-detection-1.17.0.zip", "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76", "shasum": "" }, @@ -3492,7 +3036,6 @@ "League\\MimeTypeDetection\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3507,29 +3050,14 @@ "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/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", + "url": "https://mirrors.tencent.com/repository/composer/league/uri/7.8.1/league-uri-7.8.1.zip", "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, @@ -3566,7 +3094,6 @@ "League\\Uri\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3609,25 +3136,14 @@ "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-components", "version": "7.8.1", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri-components.git", - "reference": "848ff9db2f0be06229d6034b7c2e33d41b4fd675" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/848ff9db2f0be06229d6034b7c2e33d41b4fd675", + "url": "https://mirrors.tencent.com/repository/composer/league/uri-components/7.8.1/league-uri-components-7.8.1.zip", "reference": "848ff9db2f0be06229d6034b7c2e33d41b4fd675", "shasum": "" }, @@ -3658,7 +3174,6 @@ "League\\Uri\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3693,25 +3208,14 @@ "issues": "https://github.com/thephpleague/uri-src/issues", "source": "https://github.com/thephpleague/uri-components/tree/7.8.1" }, - "funding": [ - { - "url": "https://github.com/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", + "url": "https://mirrors.tencent.com/repository/composer/league/uri-interfaces/7.8.1/league-uri-interfaces-7.8.1.zip", "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, @@ -3739,7 +3243,6 @@ "League\\Uri\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3777,26 +3280,15 @@ "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": "livewire/livewire", - "version": "v4.4.0", - "source": { - "type": "git", - "url": "https://github.com/livewire/livewire.git", - "reference": "514b29d5a23594d4e4846494f580268b20c2f11e" - }, + "version": "v4.4.5", "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/514b29d5a23594d4e4846494f580268b20c2f11e", - "reference": "514b29d5a23594d4e4846494f580268b20c2f11e", + "url": "https://mirrors.tencent.com/repository/composer/livewire/livewire/v4.4.5/livewire-livewire-v4.4.5.zip", + "reference": "10aa0b5ee44c99b5bce0f78ad265bbcf0e74abdc", "shasum": "" }, "require": { @@ -3838,7 +3330,6 @@ "Livewire\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3851,15 +3342,9 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v4.4.0" + "source": "https://github.com/livewire/livewire/tree/v4.4.5" }, - "funding": [ - { - "url": "https://github.com/livewire", - "type": "github" - } - ], - "time": "2026-08-10T15:24:22+00:00" + "time": "2026-09-14T19:27:16+00:00" }, { "name": "maennchen/zipstream-php", @@ -3941,24 +3426,19 @@ }, { "name": "masterminds/html5", - "version": "2.10.1", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "fd5018f6815fff903946d0564977b44ce8010e29" - }, + "version": "2.11.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fd5018f6815fff903946d0564977b44ce8010e29", - "reference": "fd5018f6815fff903946d0564977b44ce8010e29", + "url": "https://mirrors.tencent.com/repository/composer/masterminds/html5/2.11.0/masterminds-html5-2.11.0.zip", + "reference": "a1e7a2f88ee13635d86fc61cfbdf2306a76ddfc7", "shasum": "" }, "require": { "ext-dom": "*", - "php": ">=5.3.0" + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9 || ^10" + "phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10" }, "type": "library", "extra": { @@ -3971,7 +3451,6 @@ "Masterminds\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4002,22 +3481,17 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.10.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.11.0" }, - "time": "2026-06-23T18:43:15+00:00" + "time": "2026-08-18T06:18:41+00:00" }, { "name": "monolog/monolog", - "version": "3.10.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" - }, + "version": "3.12.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", - "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "url": "https://mirrors.tencent.com/repository/composer/monolog/monolog/3.12.0/monolog-monolog-3.12.0.zip", + "reference": "72c534fc0ab181ef52d92a68382318631e301608", "shasum": "" }, "require": { @@ -4043,6 +3517,7 @@ "phpstan/phpstan-strict-rules": "^2", "phpunit/phpunit": "^10.5.17 || ^11.0.7", "predis/predis": "^1.1 || ^2", + "psr/clock": "^1.0", "rollbar/rollbar": "^4.0", "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", @@ -4061,6 +3536,7 @@ "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", + "psr/clock": "Required to pass a clock to the Logger and control the timestamp of log records", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -4075,7 +3551,6 @@ "Monolog\\": "src/Monolog" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4095,19 +3570,9 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + "source": "https://github.com/Seldaek/monolog/tree/3.12.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" + "time": "2026-09-09T08:34:20+00:00" }, { "name": "mtdowling/jmespath.php", @@ -4237,16 +3702,11 @@ }, { "name": "nesbot/carbon", - "version": "3.13.2", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb" - }, + "version": "3.14.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "url": "https://mirrors.tencent.com/repository/composer/nesbot/carbon/3.14.0/nesbot-carbon-3.14.0.zip", + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2", "shasum": "" }, "require": { @@ -4297,7 +3757,6 @@ "Carbon\\": "src/Carbon/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4324,33 +3783,14 @@ "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-08-08T11:40:35+00:00" + "time": "2026-09-12T20:45:19+00:00" }, { "name": "nette/php-generator", "version": "v4.2.2", - "source": { - "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "0d7060926f5c3e8c488b9b9ced42d857f12a34b5" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/0d7060926f5c3e8c488b9b9ced42d857f12a34b5", + "url": "https://mirrors.tencent.com/repository/composer/nette/php-generator/v4.2.2/nette-php-generator-v4.2.2.zip", "reference": "0d7060926f5c3e8c488b9b9ced42d857f12a34b5", "shasum": "" }, @@ -4384,7 +3824,6 @@ "src/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause", "GPL-2.0-only", @@ -4416,16 +3855,11 @@ }, { "name": "nette/schema", - "version": "v1.3.5", - "source": { - "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" - }, + "version": "v1.3.6", "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", - "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "url": "https://mirrors.tencent.com/repository/composer/nette/schema/v1.3.6/nette-schema-v1.3.6.zip", + "reference": "c54350438cd6914616f790a49cb424605f421562", "shasum": "" }, "require": { @@ -4453,7 +3887,6 @@ "src/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause", "GPL-2.0-only", @@ -4477,21 +3910,16 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.5" + "source": "https://github.com/nette/schema/tree/v1.3.6" }, - "time": "2026-02-23T03:47:12+00:00" + "time": "2026-08-16T21:58:41+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", + "url": "https://mirrors.tencent.com/repository/composer/nette/utils/v4.1.5/nette-utils-v4.1.5.zip", "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", "shasum": "" }, @@ -4532,7 +3960,6 @@ "src/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause", "GPL-2.0-only", @@ -4686,14 +4113,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/nunomaduro/termwind/v2.4.0/nunomaduro-termwind-v2.4.0.zip", "reference": "712a31b768f5daea284c2169a7d227031001b9a8", "shasum": "" }, @@ -4731,7 +4153,6 @@ "Termwind\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4754,34 +4175,15 @@ "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": "openspout/openspout", - "version": "v4.28.5", - "source": { - "type": "git", - "url": "https://github.com/openspout/openspout.git", - "reference": "ab05a09fe6fce57c90338f83280648a9786ce36b" - }, + "version": "v4.32.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/openspout/openspout/zipball/ab05a09fe6fce57c90338f83280648a9786ce36b", - "reference": "ab05a09fe6fce57c90338f83280648a9786ce36b", + "url": "https://mirrors.tencent.com/repository/composer/openspout/openspout/v4.32.0/openspout-openspout-v4.32.0.zip", + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d", "shasum": "" }, "require": { @@ -4791,17 +4193,17 @@ "ext-libxml": "*", "ext-xmlreader": "*", "ext-zip": "*", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "ext-zlib": "*", - "friendsofphp/php-cs-fixer": "^3.68.3", - "infection/infection": "^0.29.10", - "phpbench/phpbench": "^1.4.0", - "phpstan/phpstan": "^2.1.2", - "phpstan/phpstan-phpunit": "^2.0.4", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^11.5.4" + "friendsofphp/php-cs-fixer": "^3.86.0", + "infection/infection": "^0.31.2", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^12.3.7" }, "suggest": { "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", @@ -4818,7 +4220,6 @@ "OpenSpout\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4849,31 +4250,16 @@ ], "support": { "issues": "https://github.com/openspout/openspout/issues", - "source": "https://github.com/openspout/openspout/tree/v4.28.5" + "source": "https://github.com/openspout/openspout/tree/v4.32.0" }, - "funding": [ - { - "url": "https://paypal.me/filippotessarotto", - "type": "custom" - }, - { - "url": "https://github.com/Slamdunk", - "type": "github" - } - ], - "time": "2025-01-30T13:51:11+00:00" + "time": "2025-09-03T16:03:54+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", + "url": "https://mirrors.tencent.com/repository/composer/paragonie/constant_time_encoding/v3.1.3/paragonie-constant_time_encoding-v3.1.3.zip", "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", "shasum": "" }, @@ -4892,7 +4278,6 @@ "ParagonIE\\ConstantTime\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4934,16 +4319,11 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.5", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" - }, + "version": "1.10.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", - "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "url": "https://mirrors.tencent.com/repository/composer/phpoption/phpoption/1.10.0/phpoption-phpoption-1.10.0.zip", + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d", "shasum": "" }, "require": { @@ -4951,7 +4331,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + "phpunit/phpunit": "^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33" }, "type": "library", "extra": { @@ -4968,7 +4348,6 @@ "PhpOption\\": "src/PhpOption/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -4993,19 +4372,9 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + "source": "https://github.com/schmittjoh/php-option/tree/1.10.0" }, - "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" + "time": "2026-08-24T00:54:40+00:00" }, { "name": "phpstan/phpdoc-parser", @@ -5056,16 +4425,11 @@ }, { "name": "pragmarx/google2fa", - "version": "v9.0.0", - "source": { - "type": "git", - "url": "https://github.com/antonioribeiro/google2fa.git", - "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf" - }, + "version": "v9.1.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/e6bc62dd6ae83acc475f57912e27466019a1f2cf", - "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf", + "url": "https://mirrors.tencent.com/repository/composer/pragmarx/google2fa/v9.1.0/pragmarx-google2fa-v9.1.0.zip", + "reference": "f00bc788c555adfb6765c437ff3538e59cd88af1", "shasum": "" }, "require": { @@ -5073,8 +4437,11 @@ "php": "^7.1|^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + "phpstan/phpstan": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.0|^2.0", + "phpunit/phpunit": "~9|~10|~11|~12|~13", + "psalm/plugin-phpunit": "^0.19|^0.20", + "vimeo/psalm": "^5.26|^6.13" }, "type": "library", "autoload": { @@ -5082,7 +4449,6 @@ "PragmaRX\\Google2FA\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5097,26 +4463,30 @@ "keywords": [ "2fa", "Authentication", + "MFA", "Two Factor Authentication", - "google2fa" + "google-authenticator", + "google2fa", + "hotp", + "otp", + "rfc4226", + "rfc6238", + "totp" ], "support": { + "docs": "https://github.com/antonioribeiro/google2fa#readme", "issues": "https://github.com/antonioribeiro/google2fa/issues", - "source": "https://github.com/antonioribeiro/google2fa/tree/v9.0.0" + "security": "https://github.com/antonioribeiro/google2fa/security/policy", + "source": "https://github.com/antonioribeiro/google2fa" }, - "time": "2025-09-19T22:51:08+00:00" + "time": "2026-08-15T13:22:01+00:00" }, { "name": "pragmarx/google2fa-qrcode", "version": "v4.0.0", - "source": { - "type": "git", - "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", - "reference": "16159f84fa0838c276f35d46de57fd90dfbb385c" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/16159f84fa0838c276f35d46de57fd90dfbb385c", + "url": "https://mirrors.tencent.com/repository/composer/pragmarx/google2fa-qrcode/v4.0.0/pragmarx-google2fa-qrcode-v4.0.0.zip", "reference": "16159f84fa0838c276f35d46de57fd90dfbb385c", "shasum": "" }, @@ -5148,7 +4518,6 @@ "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5177,14 +4546,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/clock/1.0.0/psr-clock-1.0.0.zip", "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, @@ -5197,7 +4561,6 @@ "Psr\\Clock\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5225,14 +4588,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/container/2.0.2/psr-container-2.0.2.zip", "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, @@ -5250,7 +4608,6 @@ "Psr\\Container\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5278,14 +4635,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/event-dispatcher/1.0.0/psr-event-dispatcher-1.0.0.zip", "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, @@ -5303,7 +4655,6 @@ "Psr\\EventDispatcher\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5328,14 +4679,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/http-client/1.0.3/psr-http-client-1.0.3.zip", "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, @@ -5354,7 +4700,6 @@ "Psr\\Http\\Client\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5380,14 +4725,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/http-factory/1.1.0/psr-http-factory-1.1.0.zip", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, @@ -5406,7 +4746,6 @@ "Psr\\Http\\Message\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5435,14 +4774,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/http-message/2.0/psr-http-message-2.0.zip", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, @@ -5460,7 +4794,6 @@ "Psr\\Http\\Message\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5488,14 +4821,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/log/3.0.2/psr-log-3.0.2.zip", "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, @@ -5513,7 +4841,6 @@ "Psr\\Log\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5538,14 +4865,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/psr/simple-cache/3.0.0/psr-simple-cache-3.0.0.zip", "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, @@ -5563,7 +4885,6 @@ "Psr\\SimpleCache\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5668,14 +4989,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/ralouphie/getallheaders/3.0.3/ralouphie-getallheaders-3.0.3.zip", "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, @@ -5692,7 +5008,6 @@ "src/getallheaders.php" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5712,14 +5027,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/ramsey/collection/2.1.1/ramsey-collection-2.1.1.zip", "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, @@ -5759,7 +5069,6 @@ "Ramsey\\Collection\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5788,14 +5097,9 @@ { "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", + "url": "https://mirrors.tencent.com/repository/composer/ramsey/uuid/4.9.3/ramsey-uuid-4.9.3.zip", "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8", "shasum": "" }, @@ -5847,7 +5151,6 @@ "Ramsey\\Uuid\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5866,14 +5169,9 @@ { "name": "ryangjchandler/blade-capture-directive", "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/ryangjchandler/blade-capture-directive.git", - "reference": "3f9e80b56ff60b78755ef320e3e16d88850101d6" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/3f9e80b56ff60b78755ef320e3e16d88850101d6", + "url": "https://mirrors.tencent.com/repository/composer/ryangjchandler/blade-capture-directive/v1.1.1/ryangjchandler-blade-capture-directive-v1.1.1.zip", "reference": "3f9e80b56ff60b78755ef320e3e16d88850101d6", "shasum": "" }, @@ -5911,7 +5209,6 @@ "RyanChandler\\BladeCaptureDirective\\Database\\Factories\\": "database/factories" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5933,25 +5230,14 @@ "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues", "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.1.1" }, - "funding": [ - { - "url": "https://github.com/ryangjchandler", - "type": "github" - } - ], "time": "2026-03-19T10:36:26+00:00" }, { "name": "scrivo/highlight.php", "version": "v9.18.1.10", - "source": { - "type": "git", - "url": "https://github.com/scrivo/highlight.php.git", - "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", + "url": "https://mirrors.tencent.com/repository/composer/scrivo/highlight.php/v9.18.1.10/scrivo-highlight.php-v9.18.1.10.zip", "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", "shasum": "" }, @@ -5978,7 +5264,6 @@ "HighlightUtilities\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -6011,12 +5296,6 @@ "issues": "https://github.com/scrivo/highlight.php/issues", "source": "https://github.com/scrivo/highlight.php" }, - "funding": [ - { - "url": "https://github.com/allejo", - "type": "github" - } - ], "time": "2022-12-17T21:53:22+00:00" }, { @@ -6424,16 +5703,11 @@ }, { "name": "spatie/invade", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/invade.git", - "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63" - }, + "version": "2.1.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63", - "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63", + "url": "https://mirrors.tencent.com/repository/composer/spatie/invade/2.1.1/spatie-invade-2.1.1.zip", + "reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af", "shasum": "" }, "require": { @@ -6453,7 +5727,6 @@ "Spatie\\Invade\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6471,15 +5744,9 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/invade/tree/2.1.0" + "source": "https://github.com/spatie/invade/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-05-17T09:06:10+00:00" + "time": "2026-08-24T12:39:05+00:00" }, { "name": "spatie/laravel-backup", @@ -6693,16 +5960,11 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.93.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "d5552849801f2642aea710557463234b59ef65eb" - }, + "version": "1.93.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d5552849801f2642aea710557463234b59ef65eb", - "reference": "d5552849801f2642aea710557463234b59ef65eb", + "url": "https://mirrors.tencent.com/repository/composer/spatie/laravel-package-tools/1.93.2/spatie-laravel-package-tools-1.93.2.zip", + "reference": "e927d5b5b05e9fecae098e559e51918aa608ad02", "shasum": "" }, "require": { @@ -6723,7 +5985,6 @@ "Spatie\\LaravelPackageTools\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6742,15 +6003,9 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.1" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.2" }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2026-05-19T14:06:37+00:00" + "time": "2026-08-26T09:13:25+00:00" }, { "name": "spatie/laravel-permission", @@ -7260,14 +6515,9 @@ { "name": "spatie/shiki-php", "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/shiki-php.git", - "reference": "b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/shiki-php/zipball/b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba", + "url": "https://mirrors.tencent.com/repository/composer/spatie/shiki-php/2.4.0/spatie-shiki-php-2.4.0.zip", "reference": "b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba", "shasum": "" }, @@ -7289,7 +6539,6 @@ "Spatie\\ShikiPhp\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7314,12 +6563,6 @@ "support": { "source": "https://github.com/spatie/shiki-php/tree/2.4.0" }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], "time": "2026-04-27T14:27:52+00:00" }, { @@ -7386,14 +6629,9 @@ { "name": "symfony/clock", "version": "v7.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", + "url": "https://mirrors.tencent.com/repository/composer/symfony/clock/v7.4.8/symfony-clock-v7.4.8.zip", "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", "shasum": "" }, @@ -7417,7 +6655,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7441,38 +6678,15 @@ "support": { "source": "https://github.com/symfony/clock/tree/v7.4.8" }, - "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-03-24T13:12:05+00:00" }, { "name": "symfony/console", - "version": "v7.4.16", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "f4c69c9aed03abf933b294257d618bdd9b30a06d" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4c69c9aed03abf933b294257d618bdd9b30a06d", - "reference": "f4c69c9aed03abf933b294257d618bdd9b30a06d", + "url": "https://mirrors.tencent.com/repository/composer/symfony/console/v7.4.19/symfony-console-v7.4.19.zip", + "reference": "3a1973458b153f566a8d7499bc06ece323d60063", "shasum": "" }, "require": { @@ -7514,7 +6728,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7537,40 +6750,17 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.16" + "source": "https://github.com/symfony/console/tree/v7.4.19" }, - "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-07-31T12:37:14+00:00" + "time": "2026-09-13T10:38:41+00:00" }, { "name": "symfony/css-selector", - "version": "v7.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" - }, + "version": "v7.4.18", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b75663ed96cf4756e28e3105476f220f92886cc4", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4", + "url": "https://mirrors.tencent.com/repository/composer/symfony/css-selector/v7.4.18/symfony-css-selector-v7.4.18.zip", + "reference": "fecf40067fc8d8880ea87b8ac227600b9aadd1d0", "shasum": "" }, "require": { @@ -7585,7 +6775,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7606,39 +6795,16 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.4.9" + "source": "https://github.com/symfony/css-selector/tree/v7.4.18" }, - "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-18T13:18:21+00:00" + "time": "2026-08-23T10:03:40+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/deprecation-contracts/v3.7.1/symfony-deprecation-contracts-v3.7.1.zip", "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, @@ -7660,7 +6826,6 @@ "function.php" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7679,24 +6844,6 @@ "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" }, { @@ -7773,16 +6920,11 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "d49f6a19f326db41ae7103bdc38e3eb35a791261" - }, + "version": "v7.4.17", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d49f6a19f326db41ae7103bdc38e3eb35a791261", - "reference": "d49f6a19f326db41ae7103bdc38e3eb35a791261", + "url": "https://mirrors.tencent.com/repository/composer/symfony/error-handler/v7.4.17/symfony-error-handler-v7.4.17.zip", + "reference": "8373921e231e190a88e2ad526951bbaa791576fa", "shasum": "" }, "require": { @@ -7814,7 +6956,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7831,40 +6972,17 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.15" + "source": "https://github.com/symfony/error-handler/tree/v7.4.17" }, - "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-07-21T15:13:06+00:00" + "time": "2026-08-21T17:40:08+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "336e7f3b9e95aba04f93ea9143920c2186abfbb9" - }, + "version": "v7.4.17", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/336e7f3b9e95aba04f93ea9143920c2186abfbb9", - "reference": "336e7f3b9e95aba04f93ea9143920c2186abfbb9", + "url": "https://mirrors.tencent.com/repository/composer/symfony/event-dispatcher/v7.4.17/symfony-event-dispatcher-v7.4.17.zip", + "reference": "d269974ee93c61d03620ffee358355bfdb471d66", "shasum": "" }, "require": { @@ -7899,7 +7017,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7916,39 +7033,16 @@ "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/v7.4.15" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.17" }, - "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-07-21T15:13:06+00:00" + "time": "2026-08-21T17:40:08+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/event-dispatcher-contracts/v3.7.1/symfony-event-dispatcher-contracts-v3.7.1.zip", "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", "shasum": "" }, @@ -7971,7 +7065,6 @@ "Symfony\\Contracts\\EventDispatcher\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -7998,24 +7091,6 @@ "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" }, { @@ -8090,16 +7165,11 @@ }, { "name": "symfony/finder", - "version": "v7.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "13b38720174286f55d1761152b575a8d1436fc25" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/13b38720174286f55d1761152b575a8d1436fc25", - "reference": "13b38720174286f55d1761152b575a8d1436fc25", + "url": "https://mirrors.tencent.com/repository/composer/symfony/finder/v7.4.19/symfony-finder-v7.4.19.zip", + "reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe", "shasum": "" }, "require": { @@ -8117,7 +7187,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8134,40 +7203,17 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.14" + "source": "https://github.com/symfony/finder/tree/v7.4.19" }, - "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-27T08:31:18+00:00" + "time": "2026-09-10T19:14:10+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v7.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "c328df69f5b6f44a0d031d757903d955bebb23b3" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/c328df69f5b6f44a0d031d757903d955bebb23b3", - "reference": "c328df69f5b6f44a0d031d757903d955bebb23b3", + "url": "https://mirrors.tencent.com/repository/composer/symfony/html-sanitizer/v7.4.19/symfony-html-sanitizer-v7.4.19.zip", + "reference": "d49c351e24d38604466e5a51ab20cbc99f9493c7", "shasum": "" }, "require": { @@ -8186,7 +7232,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8208,40 +7253,17 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.14" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.19" }, - "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:10:32+00:00" + "time": "2026-09-04T10:11:42+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.16", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "b676451bb638e99a7d34d8a2be90406822e301eb" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b676451bb638e99a7d34d8a2be90406822e301eb", - "reference": "b676451bb638e99a7d34d8a2be90406822e301eb", + "url": "https://mirrors.tencent.com/repository/composer/symfony/http-foundation/v7.4.19/symfony-http-foundation-v7.4.19.zip", + "reference": "f7b953be7801974a5a0685e1228bbc3b12b35936", "shasum": "" }, "require": { @@ -8273,7 +7295,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8290,40 +7311,17 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.16" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.19" }, - "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-08-07T11:50:27+00:00" + "time": "2026-09-14T17:41:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.16", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "f5e728670fa2218ae8be8ea91f2b44b7d6e5304c" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f5e728670fa2218ae8be8ea91f2b44b7d6e5304c", - "reference": "f5e728670fa2218ae8be8ea91f2b44b7d6e5304c", + "url": "https://mirrors.tencent.com/repository/composer/symfony/http-kernel/v7.4.19/symfony-http-kernel-v7.4.19.zip", + "reference": "683507424cc84ca85ac1551adb609b6b98216667", "shasum": "" }, "require": { @@ -8392,7 +7390,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8409,40 +7406,17 @@ "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/v7.4.16" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.19" }, - "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-08-07T18:00:13+00:00" + "time": "2026-09-15T07:09:35+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "68c1f27c97edd0222eb8d440a6c8c4da5354ab46" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/68c1f27c97edd0222eb8d440a6c8c4da5354ab46", - "reference": "68c1f27c97edd0222eb8d440a6c8c4da5354ab46", + "url": "https://mirrors.tencent.com/repository/composer/symfony/mailer/v7.4.19/symfony-mailer-v7.4.19.zip", + "reference": "6f6f2441bef07a42d2617b9b3aadf04a321aa514", "shasum": "" }, "require": { @@ -8476,7 +7450,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8493,40 +7466,17 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.15" + "source": "https://github.com/symfony/mailer/tree/v7.4.19" }, - "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-07-28T07:33:02+00:00" + "time": "2026-09-15T06:01:15+00:00" }, { "name": "symfony/mime", - "version": "v7.4.16", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "20094b76a7106dbe978d31cd3bd7aa1ed248d0e5" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/20094b76a7106dbe978d31cd3bd7aa1ed248d0e5", - "reference": "20094b76a7106dbe978d31cd3bd7aa1ed248d0e5", + "url": "https://mirrors.tencent.com/repository/composer/symfony/mime/v7.4.19/symfony-mime-v7.4.19.zip", + "reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693", "shasum": "" }, "require": { @@ -8550,7 +7500,7 @@ "symfony/process": "^6.4|^7.0|^8.0", "symfony/property-access": "^6.4|^7.0|^8.0", "symfony/property-info": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + "symfony/serializer": "^6.4.44|^7.4.17|^8.1.5" }, "type": "library", "autoload": { @@ -8561,7 +7511,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8582,39 +7531,16 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.16" + "source": "https://github.com/symfony/mime/tree/v7.4.19" }, - "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-08-07T14:56:57+00:00" + "time": "2026-09-04T10:45:44+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-ctype/v1.37.0/symfony-polyfill-ctype-v1.37.0.zip", "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, @@ -8642,7 +7568,6 @@ "Symfony\\Polyfill\\Ctype\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8667,37 +7592,14 @@ "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.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-intl-grapheme/v1.41.0/symfony-polyfill-intl-grapheme-v1.41.0.zip", "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", "shasum": "" }, @@ -8722,7 +7624,6 @@ "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8749,38 +7650,15 @@ "support": { "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.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-07-28T08:25:59+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" - }, + "version": "v1.42.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", - "reference": "dc21118016c039a66235cf93d96b435ffb282412", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-intl-idn/v1.42.0/symfony-polyfill-intl-idn-v1.42.0.zip", + "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9", "shasum": "" }, "require": { @@ -8805,7 +7683,6 @@ "Symfony\\Polyfill\\Intl\\Idn\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8834,40 +7711,17 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.42.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-25T15:22:23+00:00" + "time": "2026-08-24T10:51:20+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" - }, + "version": "v1.42.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-intl-normalizer/v1.42.0/symfony-polyfill-intl-normalizer-v1.42.0.zip", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", "shasum": "" }, "require": { @@ -8894,7 +7748,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -8919,39 +7772,16 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.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" + "time": "2026-08-07T06:33:24+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-mbstring/v1.38.2/symfony-polyfill-mbstring-v1.38.2.zip", "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, @@ -8980,7 +7810,6 @@ "Symfony\\Polyfill\\Mbstring\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9006,37 +7835,14 @@ "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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-php80/v1.37.0/symfony-polyfill-php80-v1.37.0.zip", "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, @@ -9061,7 +7867,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9090,37 +7895,14 @@ "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-php83", "version": "v1.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-php83/v1.41.0/symfony-polyfill-php83-v1.41.0.zip", "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6", "shasum": "" }, @@ -9145,7 +7927,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9170,37 +7951,14 @@ "support": { "source": "https://github.com/symfony/polyfill-php83/tree/v1.41.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-07-01T12:47:55+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-php84/v1.38.1/symfony-polyfill-php84-v1.38.1.zip", "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, @@ -9225,7 +7983,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9250,37 +8007,14 @@ "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.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" - }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-php85/v1.41.0/symfony-polyfill-php85-v1.41.0.zip", "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", "shasum": "" }, @@ -9305,7 +8039,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9330,37 +8063,14 @@ "support": { "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.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-07-01T12:47:55+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/polyfill-uuid/v1.37.0/symfony-polyfill-uuid-v1.37.0.zip", "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", "shasum": "" }, @@ -9388,7 +8098,6 @@ "Symfony\\Polyfill\\Uuid\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9413,38 +8122,15 @@ "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": "v7.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "f5804be144caceb570f6747519999636b664f24c" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", - "reference": "f5804be144caceb570f6747519999636b664f24c", + "url": "https://mirrors.tencent.com/repository/composer/symfony/process/v7.4.19/symfony-process-v7.4.19.zip", + "reference": "ed0ae095b86994d370d5791612e55984f15aa30e", "shasum": "" }, "require": { @@ -9459,7 +8145,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9476,40 +8161,17 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.13" + "source": "https://github.com/symfony/process/tree/v7.4.19" }, - "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-23T16:05:06+00:00" + "time": "2026-09-02T12:38:34+00:00" }, { "name": "symfony/routing", - "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "80c0a93d3f8e7499f716204a1fb38ead942a7a2b" - }, + "version": "v7.4.18", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/80c0a93d3f8e7499f716204a1fb38ead942a7a2b", - "reference": "80c0a93d3f8e7499f716204a1fb38ead942a7a2b", + "url": "https://mirrors.tencent.com/repository/composer/symfony/routing/v7.4.18/symfony-routing-v7.4.18.zip", + "reference": "ddd558991e98f693ae6bf5063cc1b0362c6bbec3", "shasum": "" }, "require": { @@ -9538,7 +8200,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9561,40 +8222,17 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.15" + "source": "https://github.com/symfony/routing/tree/v7.4.18" }, - "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-07-21T15:13:06+00:00" + "time": "2026-08-17T13:12:36+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.7.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" - }, + "version": "v3.7.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "url": "https://mirrors.tencent.com/repository/composer/symfony/service-contracts/v3.7.3/symfony-service-contracts-v3.7.3.zip", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { @@ -9623,7 +8261,6 @@ "/Test/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9648,40 +8285,17 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, - "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" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "e394af32256bf9e7bf80849d95e589167c10097b" - }, + "version": "v7.4.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e394af32256bf9e7bf80849d95e589167c10097b", - "reference": "e394af32256bf9e7bf80849d95e589167c10097b", + "url": "https://mirrors.tencent.com/repository/composer/symfony/string/v7.4.19/symfony-string-v7.4.19.zip", + "reference": "02731ce2bd26514bec9efc0baef2cd0b0cf67f46", "shasum": "" }, "require": { @@ -9714,7 +8328,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9739,40 +8352,17 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.15" + "source": "https://github.com/symfony/string/tree/v7.4.19" }, - "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-07-28T07:33:02+00:00" + "time": "2026-09-11T14:46:58+00:00" }, { "name": "symfony/translation", - "version": "v7.4.16", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "501e0ff4553c744209ca1a68790d8a4541563710" - }, + "version": "v7.4.17", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/501e0ff4553c744209ca1a68790d8a4541563710", - "reference": "501e0ff4553c744209ca1a68790d8a4541563710", + "url": "https://mirrors.tencent.com/repository/composer/symfony/translation/v7.4.17/symfony-translation-v7.4.17.zip", + "reference": "2ee1e4a3b32a528a642babe041ff7c440b213b4b", "shasum": "" }, "require": { @@ -9822,7 +8412,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9839,39 +8428,16 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.16" + "source": "https://github.com/symfony/translation/tree/v7.4.17" }, - "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-07-30T12:37:26+00:00" + "time": "2026-08-21T17:40:08+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", + "url": "https://mirrors.tencent.com/repository/composer/symfony/translation-contracts/v3.7.1/symfony-translation-contracts-v3.7.1.zip", "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621", "shasum": "" }, @@ -9896,7 +8462,6 @@ "/Test/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9923,38 +8488,15 @@ "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/uid", - "version": "v7.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "2676b524340abcfe4d6151ec698463cebafee439" - }, + "version": "v7.4.17", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2676b524340abcfe4d6151ec698463cebafee439", - "reference": "2676b524340abcfe4d6151ec698463cebafee439", + "url": "https://mirrors.tencent.com/repository/composer/symfony/uid/v7.4.17/symfony-uid-v7.4.17.zip", + "reference": "69d732355a139c6f8881337d28515aa01f12b8be", "shasum": "" }, "require": { @@ -9973,7 +8515,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9999,40 +8540,17 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.9" + "source": "https://github.com/symfony/uid/tree/v7.4.17" }, - "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-30T15:19:22+00:00" + "time": "2026-08-11T07:38:58+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "04ba4add636a95ff437af3a5a9499bb1d6c6d4bd" - }, + "version": "v7.4.18", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/04ba4add636a95ff437af3a5a9499bb1d6c6d4bd", - "reference": "04ba4add636a95ff437af3a5a9499bb1d6c6d4bd", + "url": "https://mirrors.tencent.com/repository/composer/symfony/var-dumper/v7.4.18/symfony-var-dumper-v7.4.18.zip", + "reference": "e088da50b813f32473a76871616cbb8fa54653a8", "shasum": "" }, "require": { @@ -10065,7 +8583,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -10086,39 +8603,16 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.15" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.18" }, - "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-07-21T15:13:06+00:00" + "time": "2026-08-30T20:10:52+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", + "url": "https://mirrors.tencent.com/repository/composer/tijsverkoyen/css-to-inline-styles/v2.4.0/tijsverkoyen-css-to-inline-styles-v2.4.0.zip", "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", "shasum": "" }, @@ -10144,7 +8638,6 @@ "TijsVerkoyen\\CssToInlineStyles\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -10165,16 +8658,11 @@ }, { "name": "ueberdosis/tiptap-php", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/ueberdosis/tiptap-php.git", - "reference": "74bfb7be1c8c6102b240f3879b7f984a6ab87b97" - }, + "version": "2.2.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/74bfb7be1c8c6102b240f3879b7f984a6ab87b97", - "reference": "74bfb7be1c8c6102b240f3879b7f984a6ab87b97", + "url": "https://mirrors.tencent.com/repository/composer/ueberdosis/tiptap-php/2.2.0/ueberdosis-tiptap-php-2.2.0.zip", + "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9", "shasum": "" }, "require": { @@ -10194,7 +8682,6 @@ "Tiptap\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -10214,43 +8701,24 @@ ], "support": { "issues": "https://github.com/ueberdosis/tiptap-php/issues", - "source": "https://github.com/ueberdosis/tiptap-php/tree/2.1.1" + "source": "https://github.com/ueberdosis/tiptap-php/tree/2.2.0" }, - "funding": [ - { - "url": "https://tiptap.dev/pricing", - "type": "custom" - }, - { - "url": "https://github.com/ueberdosis", - "type": "github" - }, - { - "url": "https://opencollective.com/tiptap", - "type": "open_collective" - } - ], - "time": "2026-06-12T18:19:46+00:00" + "time": "2026-08-31T07:00:09+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.6.4", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b" - }, + "version": "v5.7.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b", - "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b", + "url": "https://mirrors.tencent.com/repository/composer/vlucas/phpdotenv/v5.7.0/vlucas-phpdotenv-v5.7.0.zip", + "reference": "301c07936b16d88628b126b01d082ba153cf4c40", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.4", + "graham-campbell/result-type": "^1.2", "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.5", + "phpoption/phpoption": "^1.10", "symfony/polyfill-ctype": "^1.26", "symfony/polyfill-mbstring": "^1.26", "symfony/polyfill-php80": "^1.26" @@ -10278,7 +8746,6 @@ "Dotenv\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -10294,7 +8761,7 @@ "homepage": "https://github.com/vlucas" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "description": "Loads environment variables from `.env` to `$_ENV` and `$_SERVER` automagically, and optionally to `getenv()`.", "keywords": [ "dotenv", "env", @@ -10302,31 +8769,16 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.7.0" }, - "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" + "time": "2026-08-24T18:07:49+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", + "url": "https://mirrors.tencent.com/repository/composer/voku/portable-ascii/2.1.1/voku-portable-ascii-2.1.1.zip", "reference": "8e1051fe39379367aecf014f41744ce7539a856f", "shasum": "" }, @@ -10345,7 +8797,6 @@ "voku\\": "src/voku/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -10366,28 +8817,6 @@ "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" }, { @@ -10506,6 +8935,75 @@ ], "time": "2026-06-04T07:31:34+00:00" }, + { + "name": "xpier/filament-media-library", + "version": "v1.5.4", + "source": { + "type": "git", + "url": "https://github.com/ffqa/xpier-filament-media-library.git", + "reference": "7c7829928019ba74369f1ae004a2506f7f43ad9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ffqa/xpier-filament-media-library/zipball/7c7829928019ba74369f1ae004a2506f7f43ad9e", + "reference": "7c7829928019ba74369f1ae004a2506f7f43ad9e", + "shasum": "" + }, + "require": { + "filament/filament": "^5.3", + "laravel/framework": "^12.0", + "livewire/livewire": "^4.2", + "php": "^8.2" + }, + "require-dev": { + "laravel/pint": "^1.21", + "orchestra/testbench": "^10.0", + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Xpier\\FilamentMediaLibrary\\FilamentMediaLibraryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Xpier\\FilamentMediaLibrary\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Xpier\\FilamentMediaLibrary\\Tests\\": "tests/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gouki", + "email": "gouki.xiao@gmail.com", + "role": "Developer" + } + ], + "description": "A Filament-native media library with folder browser, inline upload, soft deletes, and a drop-in MediaPicker form field.", + "keywords": [ + "admin-panel", + "filament", + "filament-plugin", + "laravel", + "media-library", + "media-manager", + "media-picker" + ], + "support": { + "source": "https://github.com/ffqa/xpier-filament-media-library/tree/v1.5.4", + "issues": "https://github.com/ffqa/xpier-filament-media-library/issues" + }, + "time": "2026-08-27T09:07:47+00:00" + }, { "name": "yansongda/artful", "version": "v1.1.4", @@ -10852,19 +9350,16 @@ }, { "name": "hamcrest/hamcrest-php", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" - }, + "version": "v3.0.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "url": "https://mirrors.tencent.com/repository/composer/hamcrest/hamcrest-php/v3.0.0/hamcrest-hamcrest-php-v3.0.0.zip", + "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-dom": "*", "php": "^7.4|^8.0" }, "replace": { @@ -10873,13 +9368,15 @@ "kodova/hamcrest-php": "*" }, "require-dev": { + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", "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" + "dev-master": "3.0-dev" } }, "autoload": { @@ -10887,7 +9384,6 @@ "hamcrest" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -10897,9 +9393,9 @@ ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + "source": "https://github.com/hamcrest/hamcrest-php/tree/v3.0.0" }, - "time": "2025-04-30T06:54:44+00:00" + "time": "2026-03-17T11:56:53+00:00" }, { "name": "laravel/pail", @@ -11116,29 +9612,23 @@ }, { "name": "mockery/mockery", - "version": "1.6.12", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" - }, + "version": "1.6.15", "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "url": "https://mirrors.tencent.com/repository/composer/mockery/mockery/1.6.15/mockery-mockery-1.6.15.zip", + "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", + "hamcrest/hamcrest-php": "^2.0 || ^3.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" + "phpunit/phpunit": "^9.6.36", + "symplify/easy-coding-standard": "^13.2.17" }, "type": "library", "autoload": { @@ -11150,7 +9640,6 @@ "Mockery\\": "library/Mockery" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -11195,7 +9684,7 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2024-05-16T03:13:13+00:00" + "time": "2026-08-19T19:37:52+00:00" }, { "name": "nunomaduro/collision", diff --git a/database/migrations/2026_09_16_000001_add_cover_media_id_to_posts_and_categories.php b/database/migrations/2026_09_16_000001_add_cover_media_id_to_posts_and_categories.php new file mode 100644 index 0000000..1a788ea --- /dev/null +++ b/database/migrations/2026_09_16_000001_add_cover_media_id_to_posts_and_categories.php @@ -0,0 +1,40 @@ +unsignedBigInteger('cover_media_id')->nullable()->after('keywords'); + }); + } + + if (! Schema::hasColumn('categories', 'cover_media_id')) { + Schema::table('categories', function (Blueprint $table): void { + $table->unsignedBigInteger('cover_media_id')->nullable()->after('description'); + }); + } + } + + public function down(): void + { + if (Schema::hasColumn('posts', 'cover_media_id')) { + Schema::table('posts', function (Blueprint $table): void { + $table->dropColumn('cover_media_id'); + }); + } + + if (Schema::hasColumn('categories', 'cover_media_id')) { + Schema::table('categories', function (Blueprint $table): void { + $table->dropColumn('cover_media_id'); + }); + } + } +}; diff --git a/database/migrations/2026_09_16_000002_seed_default_media_folders.php b/database/migrations/2026_09_16_000002_seed_default_media_folders.php new file mode 100644 index 0000000..b57a13f --- /dev/null +++ b/database/migrations/2026_09_16_000002_seed_default_media_folders.php @@ -0,0 +1,53 @@ + 'general', 'name' => 'General', 'sort' => 0], + ['code' => 'articles', 'name' => 'Articles', 'sort' => 1], + ['code' => 'banners', 'name' => 'Banners', 'sort' => 2], + ]; + + foreach ($folders as $folder) { + $exists = DB::table('media_folders')->where('code', $folder['code'])->exists(); + if ($exists) { + continue; + } + + DB::table('media_folders')->insert([ + 'parent_id' => null, + 'code' => $folder['code'], + 'name' => $folder['name'], + 'sort' => $folder['sort'], + 'is_active' => true, + 'created_at' => $now, + 'updated_at' => $now, + ]); + } + } + + public function down(): void + { + if (! Schema::hasTable('media_folders')) { + return; + } + + DB::table('media_folders') + ->whereIn('code', ['general', 'articles', 'banners']) + ->whereNull('parent_id') + ->delete(); + } +}; diff --git a/database/schema/mysql-schema.sql b/database/schema/mysql-schema.sql new file mode 100644 index 0000000..fa76276 --- /dev/null +++ b/database/schema/mysql-schema.sql @@ -0,0 +1,582 @@ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +DROP TABLE IF EXISTS `cache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `cache_locks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache_locks` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `owner` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_locks_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `categories`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `categories` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `description` text COLLATE utf8mb4_unicode_ci, + `cover_media_id` bigint unsigned DEFAULT NULL, + `post_count` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `categories_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `comments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint unsigned NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `author_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `author_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `author_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `content` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `ip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `ai_review` json DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `comments_user_id_foreign` (`user_id`), + KEY `comments_post_id_status_index` (`post_id`,`status`), + KEY `comments_status_index` (`status`), + CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE, + CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `failed_jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `failed_jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `uuid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `hello_world_logs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hello_world_logs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint unsigned DEFAULT NULL, + `note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `hello_world_logs_comment_id_foreign` (`comment_id`), + CONSTRAINT `hello_world_logs_comment_id_foreign` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `job_batches`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `job_batches` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `total_jobs` int NOT NULL, + `pending_jobs` int NOT NULL, + `failed_jobs` int NOT NULL, + `failed_job_ids` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `options` mediumtext COLLATE utf8mb4_unicode_ci, + `cancelled_at` int DEFAULT NULL, + `created_at` int NOT NULL, + `finished_at` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `attempts` tinyint unsigned NOT NULL, + `reserved_at` int unsigned DEFAULT NULL, + `available_at` int unsigned NOT NULL, + `created_at` int unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `jobs_queue_index` (`queue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `links` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `note` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `visible` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `market_packages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `market_packages` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `item_key` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, + `item_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `price` bigint unsigned NOT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `payment_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `market_packages_item_key_item_type_unique` (`item_key`,`item_type`), + KEY `market_packages_payment_id_foreign` (`payment_id`), + KEY `market_packages_user_id_foreign` (`user_id`), + CONSTRAINT `market_packages_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `payments` (`id`) ON DELETE SET NULL, + CONSTRAINT `market_packages_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + `uuid` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `collection_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `disk` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `conversions_disk` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL, + `manipulations` json NOT NULL, + `custom_properties` json NOT NULL, + `generated_conversions` json NOT NULL, + `responsive_images` json NOT NULL, + `order_column` int unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_uuid_unique` (`uuid`), + KEY `media_model_type_model_id_index` (`model_type`,`model_id`), + KEY `media_order_column_index` (`order_column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media_folders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media_folders` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `parent_id` bigint unsigned DEFAULT NULL, + `code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sort` int NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_folders_code_unique` (`code`), + KEY `media_folders_parent_id_foreign` (`parent_id`), + CONSTRAINT `media_folders_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `media_folders` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media_library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media_library` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned DEFAULT NULL, + `disk` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'public', + `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `original_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `extension` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL DEFAULT '0', + `type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'image', + `source` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'admin', + `folder` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `alt_text` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `custom_properties` json DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_library_path_unique` (`path`), + KEY `media_library_user_id_foreign` (`user_id`), + KEY `media_library_type_index` (`type`), + KEY `media_library_folder_index` (`folder`), + KEY `media_library_source_index` (`source`), + CONSTRAINT `media_library_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `membership_plans`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `membership_plans` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci, + `price` bigint unsigned NOT NULL, + `duration_days` int unsigned NOT NULL DEFAULT '30', + `permissions` json DEFAULT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `sort` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `membership_plans_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `migrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `migrations` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `batch` int NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`model_id`,`model_type`), + KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_roles` ( + `role_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`role_id`,`model_id`,`model_type`), + KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `password_reset_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `password_reset_tokens` ( + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `order_no` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `amount` bigint unsigned NOT NULL, + `channel` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'alipay', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `gateway_trade_no` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payload` json DEFAULT NULL, + `paid_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `payable_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payable_id` bigint unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `payments_order_no_unique` (`order_no`), + KEY `payments_user_id_status_index` (`user_id`,`status`), + KEY `payments_payable_type_payable_id_index` (`payable_type`,`payable_id`), + CONSTRAINT `payments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `personal_access_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `personal_access_tokens` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `tokenable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `tokenable_id` bigint unsigned NOT NULL, + `name` text COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `abilities` text COLLATE utf8mb4_unicode_ci, + `last_used_at` timestamp NULL DEFAULT NULL, + `expires_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `personal_access_tokens_token_unique` (`token`), + KEY `personal_access_tokens_tokenable_type_tokenable_id_index` (`tokenable_type`,`tokenable_id`), + KEY `personal_access_tokens_expires_at_index` (`expires_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `plugin_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `plugin_records` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `vendor` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `version` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `plugin_records_vendor_name_unique` (`vendor`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `posts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `posts` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `category_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `excerpt` text COLLATE utf8mb4_unicode_ci, + `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `content_format` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'markdown', + `keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `cover_media_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'published', + `is_sticky` tinyint(1) NOT NULL DEFAULT '0', + `close_comment` tinyint(1) NOT NULL DEFAULT '0', + `read_password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `views` bigint unsigned NOT NULL DEFAULT '0', + `comment_count` int unsigned NOT NULL DEFAULT '0', + `meta` json DEFAULT NULL, + `published_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `posts_slug_unique` (`slug`), + KEY `posts_category_id_foreign` (`category_id`), + KEY `posts_user_id_foreign` (`user_id`), + KEY `posts_status_published_at_index` (`status`,`published_at`), + KEY `posts_status_index` (`status`), + KEY `posts_published_at_index` (`published_at`), + CONSTRAINT `posts_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL, + CONSTRAINT `posts_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `redirects`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `redirects` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `hash` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL, + `target_url` text COLLATE utf8mb4_unicode_ci NOT NULL, + `clicks` bigint unsigned NOT NULL DEFAULT '0', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `last_clicked_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `redirects_hash_unique` (`hash`), + KEY `redirects_target_url_index` (`target_url`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `role_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `role_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`role_id`), + KEY `role_has_permissions_role_id_foreign` (`role_id`), + CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, + CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sessions` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `user_agent` text COLLATE utf8mb4_unicode_ci, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `last_activity` int NOT NULL, + PRIMARY KEY (`id`), + KEY `sessions_user_id_index` (`user_id`), + KEY `sessions_last_activity_index` (`last_activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settings` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` text COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `subscriptions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `subscriptions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned NOT NULL, + `membership_plan_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `starts_at` timestamp NULL DEFAULT NULL, + `ends_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `subscriptions_membership_plan_id_foreign` (`membership_plan_id`), + KEY `subscriptions_user_id_status_index` (`user_id`,`status`), + CONSTRAINT `subscriptions_membership_plan_id_foreign` FOREIGN KEY (`membership_plan_id`) REFERENCES `membership_plans` (`id`) ON DELETE SET NULL, + CONSTRAINT `subscriptions_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `taggables`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `taggables` ( + `tag_id` bigint unsigned NOT NULL, + `taggable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `taggable_id` bigint unsigned NOT NULL, + UNIQUE KEY `taggables_tag_id_taggable_id_taggable_type_unique` (`tag_id`,`taggable_id`,`taggable_type`), + KEY `taggables_taggable_type_taggable_id_index` (`taggable_type`,`taggable_id`), + CONSTRAINT `taggables_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` json NOT NULL, + `slug` json NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `order_column` int DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email_verified_at` timestamp NULL DEFAULT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `legacy_md5` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logincount` int unsigned NOT NULL DEFAULT '0', + `loginip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `regip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logintime` timestamp NULL DEFAULT NULL, + `lastpost_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_email_unique` (`email`), + KEY `users_legacy_md5_index` (`legacy_md5`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (1,'0001_01_01_000000_create_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (2,'0001_01_01_000001_create_cache_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (3,'0001_01_01_000002_create_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (4,'2026_08_11_092446_create_permission_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (5,'2026_08_11_092448_create_media_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (6,'2026_08_11_092449_create_tag_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (7,'2026_08_11_100000_create_membership_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (8,'2026_08_11_100000_create_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (9,'2026_08_11_100001_create_categories_and_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (10,'2026_08_11_100002_create_comments_and_trackbacks_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (11,'2026_08_11_100003_create_links_and_settings_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (12,'2026_08_11_100004_add_blog_columns_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (13,'2026_08_11_100005_add_content_format_to_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (14,'2026_08_11_113537_create_personal_access_tokens_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (15,'2026_08_12_000000_create_hello_world_logs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (16,'2026_08_12_100000_add_payable_to_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (17,'2026_08_12_200000_create_market_packages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (18,'2026_08_12_300000_add_description_to_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (19,'2026_08_12_400000_create_redirects_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (20,'2026_08_15_000001_create_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (21,'2026_08_15_000002_create_media_folders_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (22,'2026_08_15_000003_add_soft_deletes_to_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (23,'2026_08_15_000004_add_custom_properties_to_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (24,'2026_09_16_000001_add_cover_media_id_to_posts_and_categories',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (25,'2026_09_16_000002_seed_default_media_folders',2); diff --git a/docs/architecture.md b/docs/architecture.md index 648ae30..f12a4b0 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -2,18 +2,18 @@ ## 技术栈 -| 层 | 技术 | 说明 | -|----|------|------| -| 框架 | Laravel 12.65 | PHP ^8.2,`declare(strict_types=1)` 全量启用 | -| 后台 | Filament 5.7 | admin panel,zh_CN,资源/页面/组件 | -| 前台交互 | Livewire 4 | Filament 依赖 | -| 数据库 | MySQL 8(生产)/ SQLite(测试 :memory:) | | -| 缓存/队列 | database / redis | 队列默认 database,可切 redis | -| Markdown | league/commonmark(GFM)+ html-to-markdown | 内容双格式 | -| 附件 | S3 兼容(R2/COS/OSS)+ spatie/laravel-medialibrary | 零落盘 | -| 异步 | Workerman 5 常驻(队列消费者 + WebSocket) | 复用 Laravel Queue Worker | -| 支付 | yansongda/pay(支付宝/微信) | 沙箱模式内置 | -| 权限 | spatie/laravel-permission | admin/editor/member | +| 层 | 技术 | 说明 | +| --------- | --------------------------------------------------------------------- | -------------------------------------------- | +| 框架 | Laravel 12.65 | PHP ^8.2,`declare(strict_types=1)` 全量启用 | +| 后台 | Filament 5.7 | admin panel,zh_CN,资源/页面/组件 | +| 前台交互 | Livewire 4 | Filament 依赖 | +| 数据库 | MySQL 8(生产)/ SQLite(测试 :memory:) | | +| 缓存/队列 | database / redis | 队列默认 database,可切 redis | +| Markdown | league/commonmark(GFM)+ html-to-markdown | 内容双格式 | +| 附件 | xpier media library(新上传)+ Spatie medialibrary(sablog 导入兜底) | 正文存 `media:ID` / `attach:ID` | +| 异步 | Workerman 5 常驻(队列消费者 + WebSocket) | 复用 Laravel Queue Worker | +| 支付 | yansongda/pay(支付宝/微信) | 沙箱模式内置 | +| 权限 | spatie/laravel-permission | admin/editor/member | ## 目录分层 @@ -37,7 +37,7 @@ plugins/ # 插件(plugin.json + ServiceProvider + 迁移/路由/ 1. **内容双格式**:`posts.content_format`(markdown/html)。新文章默认 Markdown;老数据导入标记 html 原样保留,`content:convert` 可批量转 Markdown。渲染管线 `PostContentRenderer::render()` 统一输出 HTML,再经 `post.rendered` 过滤器(付费内容等)。 -2. **附件短代码**:HTML 内容 `[attach=1]`/`[img=1]`;Markdown 内容用 `{{attach:1}}`/`{{img:1}}` 令牌(`[]` 是 Markdown 保留字符)。渲染时按**全局** legacy_attachmentid 解析,找不到媒体自动清理残留。 +2. **附件短代码**:新内容 Markdown 用 `![alt](media:ID)` / `[name](media:ID)`,HTML 用 `[media=ID]`,渲染时换成媒体库 URL。老 sablog 仍用 `[attach=1]`/`[img=1]` 或 `{{attach:1}}`/`{{img:1}}`。不要把 CDN 地址写进正文。详见 [docs/media.md](media.md)。 3. **主题系统**:激活主题的 views 目录前置到全局视图路径(View Finder),主题覆盖同名视图、缺失回退默认视图。header 打开的容器由页面视图自闭合(避免 footer 错位)。资产开发期流式返回、生产 `theme:publish`。 @@ -56,21 +56,21 @@ plugins/ # 插件(plugin.json + ServiceProvider + 迁移/路由/ - **本地**:Herd 托管 `laralog.test`(PHP 8.2 + MySQL 8);无 S3 时附件落本地 public - **测试**:PHPUnit,SQLite `:memory:`(`phpunit.xml`),`RefreshDatabase` + `seed()`;MySQL 专属 SQL(syncCounters)在 sqlite 兼容 - **常用命令**: - - `php artisan sablog:import --fresh --convert-markdown`(老库迁移) - - `php artisan workerman:serve start|stop` - - `php artisan test` - - `php artisan theme:publish` / `content:convert --all` / `attachments:sync-s3` + - `php artisan sablog:import --fresh --convert-markdown`(老库迁移) + - `php artisan workerman:serve start|stop` + - `php artisan test` + - `php artisan theme:publish` / `content:convert --all` / `attachments:sync-s3` ## 配置速查 -| 配置 | 说明 | -|------|------| -| `config/blog.php` | 站点/每页数/附件磁盘 | -| `config/themes.php` | 主题目录/默认主题 | -| `config/plugins.php` | 插件目录/内置启用列表 | -| `config/workerman.php` | 消费者数/队列连接/队列名/重试 | -| `config/media.php` | S3 配置(R2/COS/OSS)与 Multipart 阈值 | -| `config/market.php` | 插件/主题市场远程源 | +| 配置 | 说明 | +| ---------------------- | -------------------------------------- | +| `config/blog.php` | 站点/每页数/附件磁盘 | +| `config/themes.php` | 主题目录/默认主题 | +| `config/plugins.php` | 插件目录/内置启用列表 | +| `config/workerman.php` | 消费者数/队列连接/队列名/重试 | +| `config/media.php` | S3 配置(R2/COS/OSS)与 Multipart 阈值 | +| `config/market.php` | 插件/主题市场远程源 | ## 已知边界 diff --git a/docs/database/mysql-schema-20260907-223948.sql b/docs/database/mysql-schema-20260907-223948.sql new file mode 100644 index 0000000..d02b3c3 --- /dev/null +++ b/docs/database/mysql-schema-20260907-223948.sql @@ -0,0 +1,527 @@ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +DROP TABLE IF EXISTS `cache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `cache_locks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache_locks` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `owner` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_locks_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `categories`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `categories` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `description` text COLLATE utf8mb4_unicode_ci, + `post_count` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `categories_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `comments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint unsigned NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `author_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `author_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `author_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `content` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `ip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `ai_review` json DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `comments_user_id_foreign` (`user_id`), + KEY `comments_post_id_status_index` (`post_id`,`status`), + KEY `comments_status_index` (`status`), + CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE, + CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `failed_jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `failed_jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `uuid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `hello_world_logs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hello_world_logs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint unsigned DEFAULT NULL, + `note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `hello_world_logs_comment_id_foreign` (`comment_id`), + CONSTRAINT `hello_world_logs_comment_id_foreign` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `job_batches`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `job_batches` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `total_jobs` int NOT NULL, + `pending_jobs` int NOT NULL, + `failed_jobs` int NOT NULL, + `failed_job_ids` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `options` mediumtext COLLATE utf8mb4_unicode_ci, + `cancelled_at` int DEFAULT NULL, + `created_at` int NOT NULL, + `finished_at` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `attempts` tinyint unsigned NOT NULL, + `reserved_at` int unsigned DEFAULT NULL, + `available_at` int unsigned NOT NULL, + `created_at` int unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `jobs_queue_index` (`queue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `links` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `note` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `visible` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `market_packages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `market_packages` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `item_key` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, + `item_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `price` bigint unsigned NOT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `payment_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `market_packages_item_key_item_type_unique` (`item_key`,`item_type`), + KEY `market_packages_payment_id_foreign` (`payment_id`), + KEY `market_packages_user_id_foreign` (`user_id`), + CONSTRAINT `market_packages_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `payments` (`id`) ON DELETE SET NULL, + CONSTRAINT `market_packages_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + `uuid` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `collection_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `disk` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `conversions_disk` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL, + `manipulations` json NOT NULL, + `custom_properties` json NOT NULL, + `generated_conversions` json NOT NULL, + `responsive_images` json NOT NULL, + `order_column` int unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_uuid_unique` (`uuid`), + KEY `media_model_type_model_id_index` (`model_type`,`model_id`), + KEY `media_order_column_index` (`order_column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `membership_plans`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `membership_plans` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci, + `price` bigint unsigned NOT NULL, + `duration_days` int unsigned NOT NULL DEFAULT '30', + `permissions` json DEFAULT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `sort` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `membership_plans_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `migrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `migrations` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `batch` int NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`model_id`,`model_type`), + KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_roles` ( + `role_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`role_id`,`model_id`,`model_type`), + KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `password_reset_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `password_reset_tokens` ( + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `order_no` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `amount` bigint unsigned NOT NULL, + `channel` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'alipay', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `gateway_trade_no` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payload` json DEFAULT NULL, + `paid_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `payable_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payable_id` bigint unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `payments_order_no_unique` (`order_no`), + KEY `payments_user_id_status_index` (`user_id`,`status`), + KEY `payments_payable_type_payable_id_index` (`payable_type`,`payable_id`), + CONSTRAINT `payments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `personal_access_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `personal_access_tokens` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `tokenable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `tokenable_id` bigint unsigned NOT NULL, + `name` text COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `abilities` text COLLATE utf8mb4_unicode_ci, + `last_used_at` timestamp NULL DEFAULT NULL, + `expires_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `personal_access_tokens_token_unique` (`token`), + KEY `personal_access_tokens_tokenable_type_tokenable_id_index` (`tokenable_type`,`tokenable_id`), + KEY `personal_access_tokens_expires_at_index` (`expires_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `plugin_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `plugin_records` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `vendor` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `version` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `plugin_records_vendor_name_unique` (`vendor`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `posts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `posts` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `category_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `excerpt` text COLLATE utf8mb4_unicode_ci, + `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `content_format` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'markdown', + `keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'published', + `is_sticky` tinyint(1) NOT NULL DEFAULT '0', + `close_comment` tinyint(1) NOT NULL DEFAULT '0', + `read_password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `views` bigint unsigned NOT NULL DEFAULT '0', + `comment_count` int unsigned NOT NULL DEFAULT '0', + `meta` json DEFAULT NULL, + `published_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `posts_slug_unique` (`slug`), + KEY `posts_category_id_foreign` (`category_id`), + KEY `posts_user_id_foreign` (`user_id`), + KEY `posts_status_published_at_index` (`status`,`published_at`), + KEY `posts_status_index` (`status`), + KEY `posts_published_at_index` (`published_at`), + CONSTRAINT `posts_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL, + CONSTRAINT `posts_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `redirects`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `redirects` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `hash` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL, + `target_url` text COLLATE utf8mb4_unicode_ci NOT NULL, + `clicks` bigint unsigned NOT NULL DEFAULT '0', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `last_clicked_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `redirects_hash_unique` (`hash`), + KEY `redirects_target_url_index` (`target_url`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `role_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `role_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`role_id`), + KEY `role_has_permissions_role_id_foreign` (`role_id`), + CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, + CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sessions` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `user_agent` text COLLATE utf8mb4_unicode_ci, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `last_activity` int NOT NULL, + PRIMARY KEY (`id`), + KEY `sessions_user_id_index` (`user_id`), + KEY `sessions_last_activity_index` (`last_activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settings` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` text COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `subscriptions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `subscriptions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned NOT NULL, + `membership_plan_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `starts_at` timestamp NULL DEFAULT NULL, + `ends_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `subscriptions_membership_plan_id_foreign` (`membership_plan_id`), + KEY `subscriptions_user_id_status_index` (`user_id`,`status`), + CONSTRAINT `subscriptions_membership_plan_id_foreign` FOREIGN KEY (`membership_plan_id`) REFERENCES `membership_plans` (`id`) ON DELETE SET NULL, + CONSTRAINT `subscriptions_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `taggables`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `taggables` ( + `tag_id` bigint unsigned NOT NULL, + `taggable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `taggable_id` bigint unsigned NOT NULL, + UNIQUE KEY `taggables_tag_id_taggable_id_taggable_type_unique` (`tag_id`,`taggable_id`,`taggable_type`), + KEY `taggables_taggable_type_taggable_id_index` (`taggable_type`,`taggable_id`), + CONSTRAINT `taggables_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` json NOT NULL, + `slug` json NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `order_column` int DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email_verified_at` timestamp NULL DEFAULT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `legacy_md5` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logincount` int unsigned NOT NULL DEFAULT '0', + `loginip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `regip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logintime` timestamp NULL DEFAULT NULL, + `lastpost_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_email_unique` (`email`), + KEY `users_legacy_md5_index` (`legacy_md5`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (1,'0001_01_01_000000_create_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (2,'0001_01_01_000001_create_cache_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (3,'0001_01_01_000002_create_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (4,'2026_08_11_092446_create_permission_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (5,'2026_08_11_092448_create_media_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (6,'2026_08_11_092449_create_tag_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (7,'2026_08_11_100000_create_membership_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (8,'2026_08_11_100000_create_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (9,'2026_08_11_100001_create_categories_and_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (10,'2026_08_11_100002_create_comments_and_trackbacks_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (11,'2026_08_11_100003_create_links_and_settings_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (12,'2026_08_11_100004_add_blog_columns_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (13,'2026_08_11_100005_add_content_format_to_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (14,'2026_08_11_113537_create_personal_access_tokens_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (15,'2026_08_12_000000_create_hello_world_logs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (16,'2026_08_12_100000_add_payable_to_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (17,'2026_08_12_200000_create_market_packages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (18,'2026_08_12_300000_add_description_to_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (19,'2026_08_12_400000_create_redirects_table',1); diff --git a/docs/database/mysql-schema-20260916-131822.sql b/docs/database/mysql-schema-20260916-131822.sql new file mode 100644 index 0000000..fa76276 --- /dev/null +++ b/docs/database/mysql-schema-20260916-131822.sql @@ -0,0 +1,582 @@ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +DROP TABLE IF EXISTS `cache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `cache_locks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache_locks` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `owner` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_locks_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `categories`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `categories` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `description` text COLLATE utf8mb4_unicode_ci, + `cover_media_id` bigint unsigned DEFAULT NULL, + `post_count` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `categories_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `comments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint unsigned NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `author_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `author_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `author_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `content` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `ip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `ai_review` json DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `comments_user_id_foreign` (`user_id`), + KEY `comments_post_id_status_index` (`post_id`,`status`), + KEY `comments_status_index` (`status`), + CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE, + CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `failed_jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `failed_jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `uuid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `hello_world_logs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hello_world_logs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint unsigned DEFAULT NULL, + `note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `hello_world_logs_comment_id_foreign` (`comment_id`), + CONSTRAINT `hello_world_logs_comment_id_foreign` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `job_batches`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `job_batches` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `total_jobs` int NOT NULL, + `pending_jobs` int NOT NULL, + `failed_jobs` int NOT NULL, + `failed_job_ids` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `options` mediumtext COLLATE utf8mb4_unicode_ci, + `cancelled_at` int DEFAULT NULL, + `created_at` int NOT NULL, + `finished_at` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `attempts` tinyint unsigned NOT NULL, + `reserved_at` int unsigned DEFAULT NULL, + `available_at` int unsigned NOT NULL, + `created_at` int unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `jobs_queue_index` (`queue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `links` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `note` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `visible` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `market_packages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `market_packages` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `item_key` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, + `item_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `price` bigint unsigned NOT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `payment_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `market_packages_item_key_item_type_unique` (`item_key`,`item_type`), + KEY `market_packages_payment_id_foreign` (`payment_id`), + KEY `market_packages_user_id_foreign` (`user_id`), + CONSTRAINT `market_packages_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `payments` (`id`) ON DELETE SET NULL, + CONSTRAINT `market_packages_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + `uuid` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `collection_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `disk` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `conversions_disk` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL, + `manipulations` json NOT NULL, + `custom_properties` json NOT NULL, + `generated_conversions` json NOT NULL, + `responsive_images` json NOT NULL, + `order_column` int unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_uuid_unique` (`uuid`), + KEY `media_model_type_model_id_index` (`model_type`,`model_id`), + KEY `media_order_column_index` (`order_column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media_folders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media_folders` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `parent_id` bigint unsigned DEFAULT NULL, + `code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sort` int NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_folders_code_unique` (`code`), + KEY `media_folders_parent_id_foreign` (`parent_id`), + CONSTRAINT `media_folders_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `media_folders` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media_library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media_library` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned DEFAULT NULL, + `disk` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'public', + `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `original_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `extension` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL DEFAULT '0', + `type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'image', + `source` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'admin', + `folder` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `alt_text` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `custom_properties` json DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_library_path_unique` (`path`), + KEY `media_library_user_id_foreign` (`user_id`), + KEY `media_library_type_index` (`type`), + KEY `media_library_folder_index` (`folder`), + KEY `media_library_source_index` (`source`), + CONSTRAINT `media_library_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `membership_plans`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `membership_plans` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci, + `price` bigint unsigned NOT NULL, + `duration_days` int unsigned NOT NULL DEFAULT '30', + `permissions` json DEFAULT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `sort` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `membership_plans_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `migrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `migrations` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `batch` int NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`model_id`,`model_type`), + KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_roles` ( + `role_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`role_id`,`model_id`,`model_type`), + KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `password_reset_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `password_reset_tokens` ( + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `order_no` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `amount` bigint unsigned NOT NULL, + `channel` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'alipay', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `gateway_trade_no` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payload` json DEFAULT NULL, + `paid_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `payable_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payable_id` bigint unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `payments_order_no_unique` (`order_no`), + KEY `payments_user_id_status_index` (`user_id`,`status`), + KEY `payments_payable_type_payable_id_index` (`payable_type`,`payable_id`), + CONSTRAINT `payments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `personal_access_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `personal_access_tokens` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `tokenable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `tokenable_id` bigint unsigned NOT NULL, + `name` text COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `abilities` text COLLATE utf8mb4_unicode_ci, + `last_used_at` timestamp NULL DEFAULT NULL, + `expires_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `personal_access_tokens_token_unique` (`token`), + KEY `personal_access_tokens_tokenable_type_tokenable_id_index` (`tokenable_type`,`tokenable_id`), + KEY `personal_access_tokens_expires_at_index` (`expires_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `plugin_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `plugin_records` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `vendor` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `version` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `plugin_records_vendor_name_unique` (`vendor`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `posts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `posts` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `category_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `excerpt` text COLLATE utf8mb4_unicode_ci, + `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `content_format` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'markdown', + `keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `cover_media_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'published', + `is_sticky` tinyint(1) NOT NULL DEFAULT '0', + `close_comment` tinyint(1) NOT NULL DEFAULT '0', + `read_password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `views` bigint unsigned NOT NULL DEFAULT '0', + `comment_count` int unsigned NOT NULL DEFAULT '0', + `meta` json DEFAULT NULL, + `published_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `posts_slug_unique` (`slug`), + KEY `posts_category_id_foreign` (`category_id`), + KEY `posts_user_id_foreign` (`user_id`), + KEY `posts_status_published_at_index` (`status`,`published_at`), + KEY `posts_status_index` (`status`), + KEY `posts_published_at_index` (`published_at`), + CONSTRAINT `posts_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL, + CONSTRAINT `posts_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `redirects`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `redirects` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `hash` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL, + `target_url` text COLLATE utf8mb4_unicode_ci NOT NULL, + `clicks` bigint unsigned NOT NULL DEFAULT '0', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `last_clicked_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `redirects_hash_unique` (`hash`), + KEY `redirects_target_url_index` (`target_url`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `role_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `role_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`role_id`), + KEY `role_has_permissions_role_id_foreign` (`role_id`), + CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, + CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sessions` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `user_agent` text COLLATE utf8mb4_unicode_ci, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `last_activity` int NOT NULL, + PRIMARY KEY (`id`), + KEY `sessions_user_id_index` (`user_id`), + KEY `sessions_last_activity_index` (`last_activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settings` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` text COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `subscriptions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `subscriptions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned NOT NULL, + `membership_plan_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `starts_at` timestamp NULL DEFAULT NULL, + `ends_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `subscriptions_membership_plan_id_foreign` (`membership_plan_id`), + KEY `subscriptions_user_id_status_index` (`user_id`,`status`), + CONSTRAINT `subscriptions_membership_plan_id_foreign` FOREIGN KEY (`membership_plan_id`) REFERENCES `membership_plans` (`id`) ON DELETE SET NULL, + CONSTRAINT `subscriptions_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `taggables`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `taggables` ( + `tag_id` bigint unsigned NOT NULL, + `taggable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `taggable_id` bigint unsigned NOT NULL, + UNIQUE KEY `taggables_tag_id_taggable_id_taggable_type_unique` (`tag_id`,`taggable_id`,`taggable_type`), + KEY `taggables_taggable_type_taggable_id_index` (`taggable_type`,`taggable_id`), + CONSTRAINT `taggables_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` json NOT NULL, + `slug` json NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `order_column` int DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email_verified_at` timestamp NULL DEFAULT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `legacy_md5` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logincount` int unsigned NOT NULL DEFAULT '0', + `loginip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `regip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logintime` timestamp NULL DEFAULT NULL, + `lastpost_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_email_unique` (`email`), + KEY `users_legacy_md5_index` (`legacy_md5`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (1,'0001_01_01_000000_create_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (2,'0001_01_01_000001_create_cache_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (3,'0001_01_01_000002_create_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (4,'2026_08_11_092446_create_permission_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (5,'2026_08_11_092448_create_media_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (6,'2026_08_11_092449_create_tag_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (7,'2026_08_11_100000_create_membership_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (8,'2026_08_11_100000_create_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (9,'2026_08_11_100001_create_categories_and_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (10,'2026_08_11_100002_create_comments_and_trackbacks_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (11,'2026_08_11_100003_create_links_and_settings_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (12,'2026_08_11_100004_add_blog_columns_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (13,'2026_08_11_100005_add_content_format_to_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (14,'2026_08_11_113537_create_personal_access_tokens_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (15,'2026_08_12_000000_create_hello_world_logs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (16,'2026_08_12_100000_add_payable_to_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (17,'2026_08_12_200000_create_market_packages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (18,'2026_08_12_300000_add_description_to_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (19,'2026_08_12_400000_create_redirects_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (20,'2026_08_15_000001_create_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (21,'2026_08_15_000002_create_media_folders_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (22,'2026_08_15_000003_add_soft_deletes_to_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (23,'2026_08_15_000004_add_custom_properties_to_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (24,'2026_09_16_000001_add_cover_media_id_to_posts_and_categories',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (25,'2026_09_16_000002_seed_default_media_folders',2); diff --git a/docs/import.md b/docs/import.md index 005fc52..e22f6a5 100644 --- a/docs/import.md +++ b/docs/import.md @@ -24,39 +24,40 @@ php artisan sablog:import \ ### 参数说明 -| 参数 | 默认 | 说明 | -|------|------|------| -| `--driver` | mysql | 老库驱动(测试可用 `sqlite`) | -| `--host` / `--port` | 127.0.0.1 / 3306 | 老库地址 | -| `--database` | (必填) | 老库名 | -| `--username` / `--password` | root / 空 | 老库账号 | -| `--prefix` | `sablog_` | 老表前缀(老站可能自定义过) | -| `--attachments-dir` | — | 老附件目录,配合 `--sync-attachments` 用 | -| `--sync-attachments` | 关 | 同步附件文件到新存储(本地中转或直接上 S3) | -| `--convert-markdown` | 关 | 导入时把 HTML 正文转为 Markdown | -| `--fresh` | 关 | 清空目标表后重新导入 | +| 参数 | 默认 | 说明 | +| --------------------------- | ---------------- | ------------------------------------------- | +| `--driver` | mysql | 老库驱动(测试可用 `sqlite`) | +| `--host` / `--port` | 127.0.0.1 / 3306 | 老库地址 | +| `--database` | (必填) | 老库名 | +| `--username` / `--password` | root / 空 | 老库账号 | +| `--prefix` | `sablog_` | 老表前缀(老站可能自定义过) | +| `--attachments-dir` | — | 老附件目录,配合 `--sync-attachments` 用 | +| `--sync-attachments` | 关 | 同步附件文件到新存储(本地中转或直接上 S3) | +| `--convert-markdown` | 关 | 导入时把 HTML 正文转为 Markdown | +| `--fresh` | 关 | 清空目标表后重新导入 | ## 数据映射 -| 老表 | 新表 | 说明 | -|------|------|------| -| `users` | `users` | **ID 保留**;老 MD5 密码进 `legacy_md5`,登录时自动升级为 bcrypt | -| `articles` | `posts` | **articleid 保留为 id**;`[attach=xx]` 按内容格式处理(见下) | -| `categories` | `categories` | cid 保留;导入后自动重算文章数 | -| `comments` | `comments` | commentid 保留;visible 语义映射为状态 | -| `links` | `links` | linkid 保留 | -| `attachments` | medialibrary `media` | 文件 + `legacy_attachmentid` 映射(老 `[attach=xx]` 按此解析) | -| `settings` | `settings` | 键值映射为站点设置(可在后台「博客设置」继续改) | -| `tags` | spatie tags | 老 aids 文本解析为独立标签 + 关联 | +| 老表 | 新表 | 说明 | +| ------------- | -------------------- | ---------------------------------------------------------------- | +| `users` | `users` | **ID 保留**;老 MD5 密码进 `legacy_md5`,登录时自动升级为 bcrypt | +| `articles` | `posts` | **articleid 保留为 id**;`[attach=xx]` 按内容格式处理(见下) | +| `categories` | `categories` | cid 保留;导入后自动重算文章数 | +| `comments` | `comments` | commentid 保留;visible 语义映射为状态 | +| `links` | `links` | linkid 保留 | +| `attachments` | medialibrary `media` | 文件 + `legacy_attachmentid` 映射(老 `[attach=xx]` 按此解析) | +| `settings` | `settings` | 键值映射为站点设置(可在后台「博客设置」继续改) | +| `tags` | spatie tags | 老 aids 文本解析为独立标签 + 关联 | **不迁移**:trackback/引用通告(垃圾来源,接口已关闭)、搜索缓存表、验证码(由 AI 审核 + 蜜罐 + 频控取代)。 ## 附件短代码的处理 -| 老内容 | 导入后 | -|--------|--------| -| HTML 正文 `[attach=12]` | 原样保留,**渲染时按 legacy id 解析**为附件链接/图片 | -| Markdown 正文(--convert-markdown) | 自动转成 `{{attach:12}}` 令牌(`[]` 是 Markdown 保留字符) | +| 老内容 | 导入后 | +| ----------------------------------- | --------------------------------------------------------------------------------------------- | +| HTML 正文 `[attach=12]` | 原样保留,**渲染时按 legacy id 解析**为附件链接/图片 | +| Markdown 正文(--convert-markdown) | 自动转成 `{{attach:12}}` 令牌(`[]` 是 Markdown 保留字符) | +| 新写作(媒体库) | 写入 `![alt](media:ID)` / `[name](media:ID)`,渲染时换成媒体库 URL(见 [media.md](media.md)) | 两种格式都能正常显示老附件,无需手工替换。 @@ -105,9 +106,9 @@ php artisan content:convert --all --dry-run # 先预览 ## 常见问题 -| 现象 | 处理 | -|------|------| -| 报「找不到老表」 | 检查 `--prefix`(老站表前缀可能不是 `sablog_`)与老库名 | -| 附件显示不出来 | 确认 `--attachments-dir` 路径正确;看 `attachments:sync-s3` 输出报告 | -| 老密码登录失败 | 老库密码若是自定义加密(非 MD5),需要按 `User::verifyPassword` 扩展 | -| 中文乱码 | 老库导出时用 utf8mb4;`--driver=sqlite` 只用于测试 | +| 现象 | 处理 | +| ---------------- | -------------------------------------------------------------------- | +| 报「找不到老表」 | 检查 `--prefix`(老站表前缀可能不是 `sablog_`)与老库名 | +| 附件显示不出来 | 确认 `--attachments-dir` 路径正确;看 `attachments:sync-s3` 输出报告 | +| 老密码登录失败 | 老库密码若是自定义加密(非 MD5),需要按 `User::verifyPassword` 扩展 | +| 中文乱码 | 老库导出时用 utf8mb4;`--driver=sqlite` 只用于测试 | diff --git a/docs/install.md b/docs/install.md index a3c51a0..b8d516b 100644 --- a/docs/install.md +++ b/docs/install.md @@ -4,12 +4,12 @@ ## 环境要求 -| 组件 | 要求 | -|------|------| -| PHP | **8.2+**(需 pcntl 扩展用于 Workerman;GD/Imagick 用于缩略图) | -| MySQL | **8.x** | -| Composer | 2.x | -| 可选 | Node.js(前台资源构建)、S3 兼容存储(R2/COS/OSS/MinIO)、OpenAI 兼容 LLM | +| 组件 | 要求 | +| -------- | ------------------------------------------------------------------------- | +| PHP | **8.2+**(需 pcntl 扩展用于 Workerman;GD/Imagick 用于缩略图) | +| MySQL | **8.x** | +| Composer | 2.x | +| 可选 | Node.js(前台资源构建)、S3 兼容存储(R2/COS/OSS/MinIO)、OpenAI 兼容 LLM | ## 1. 获取代码与依赖 @@ -33,6 +33,7 @@ DB_PASSWORD= # 以下为可选能力(不配也能跑,见注释): # S3_* 附件存储(不配置回退本地 public) +# MEDIA_DISK=public 新媒体库磁盘(正文写 media:ID,见 docs/media.md) # LLM_* AI 评论审核/润色 # MARKET_* 插件/主题远程市场 ``` @@ -84,11 +85,11 @@ php artisan queue:work --queue=default,ai ## 5. 常见问题 -| 现象 | 处理 | -|------|------| -| 页面 500 / 空白 | `storage/`、`bootstrap/cache/` 目录需可写;`php artisan config:clear` | -| 中文乱码 | 数据库/连接字符集 utf8mb4 | -| 后台样式错乱 | `php artisan filament:assets`(重新发布后台资源) | -| 文章编辑框太小 | 已内置加大样式;仍不够可调整 `app/Providers/AppServiceProvider.php` 中 `.fi-fo-markdown-editor` 的 min-height | -| 附件上传失败 | 未配 S3 时走本地 public 磁盘;配 S3 后确认 `S3_*` 键与桶权限 | -| 插件停用后功能消失 | 属预期:付费列/外链中转等由插件注入,后台「插件管理」重新启用即可 | +| 现象 | 处理 | +| ------------------ | ------------------------------------------------------------------------------------------------------------- | +| 页面 500 / 空白 | `storage/`、`bootstrap/cache/` 目录需可写;`php artisan config:clear` | +| 中文乱码 | 数据库/连接字符集 utf8mb4 | +| 后台样式错乱 | `php artisan filament:assets`(重新发布后台资源) | +| 文章编辑框太小 | 已内置加大样式;仍不够可调整 `app/Providers/AppServiceProvider.php` 中 `.fi-fo-markdown-editor` 的 min-height | +| 附件上传失败 | 未配 S3 时走本地 public 磁盘;配 S3 后确认 `S3_*` 键与桶权限 | +| 插件停用后功能消失 | 属预期:付费列/外链中转等由插件注入,后台「插件管理」重新启用即可 | diff --git a/docs/media.md b/docs/media.md new file mode 100644 index 0000000..da0942c --- /dev/null +++ b/docs/media.md @@ -0,0 +1,32 @@ +# Media library (xpier) + +New uploads, covers, and in-body images/files use `xpier/filament-media-library`. Sablog Spatie media / `attachments` rows stay for import and legacy shortcodes. + +## Markdown body (do not paste CDN URLs) + +The editor writes a **stable reference**. The public URL is resolved only when the page is rendered. + +| Format | Image | File | +| -------- | ------------------ | ----------------------- | +| Markdown | `![alt](media:12)` | `[notes.pdf](media:12)` | +| HTML | `[media=12]` | `[media=12]` | + +Admin flow: pick a file in **Insert from media library**, then click **Insert into body**. That appends the snippet above. Do not copy object-storage / CDN addresses into the article. + +Legacy sablog tokens are unchanged: `[attach=ID]`, `{{attach:ID}}`, `![alt](attach:ID)`. + +## Admin + +- Library: `/admin/media-library` +- Folders: `/admin/media-folders` (defaults: `general`, `articles`, `banners`) +- Cover: `MediaPicker` bound to `coverMedia` / `cover_media_id` + +## Config + +```env +MEDIA_DISK=public +MEDIA_DIRECTORY=media +MEDIA_VISIBILITY=public +``` + +Run `php artisan storage:link` when using the `public` disk locally. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c5230bd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2561 @@ +{ + "name": "laralog", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwindcss": "^4.0.0", + "vite": "^7.0.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "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.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "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.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.19.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "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.npmmirror.com/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.npmmirror.com/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/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concurrently": { + "version": "9.2.4", + "resolved": "https://registry.npmmirror.com/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/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "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.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "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.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "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/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "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.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "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.npmmirror.com/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "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.npmmirror.com/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.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "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.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "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.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "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.npmmirror.com/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/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/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/laravel-vite-plugin/-/laravel-vite-plugin-2.1.0.tgz", + "integrity": "sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": 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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "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.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "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.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "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.npmmirror.com/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, + "libc": [ + "musl" + ], + "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.npmmirror.com/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.npmmirror.com/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/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "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.17", + "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.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/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/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/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/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "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.npmmirror.com/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.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "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", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.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 + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "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.npmmirror.com/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.npmmirror.com/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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/phpunit.xml b/phpunit.xml index e7f0a48..95278ad 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -32,5 +32,6 @@ + diff --git a/plugins/neatstudio.blog-seo/src/Http/Middleware/SeoMiddleware.php b/plugins/neatstudio.blog-seo/src/Http/Middleware/SeoMiddleware.php index 68d1809..b7ef81f 100644 --- a/plugins/neatstudio.blog-seo/src/Http/Middleware/SeoMiddleware.php +++ b/plugins/neatstudio.blog-seo/src/Http/Middleware/SeoMiddleware.php @@ -84,8 +84,8 @@ class SeoMiddleware 'mainEntityOfPage' => route('posts.show', $post->slug ?: $post->id), ]; - if ($cover = $post->getFirstMedia('cover')) { - $data['image'] = [$cover->getUrl('card') ?: $cover->getUrl()]; + if ($cover = $post->coverImageUrl()) { + $data['image'] = [$cover]; } return $data; diff --git a/plugins/neatstudio.link-tracker/database/migrations/2026_08_12_400000_create_redirects_table.php b/plugins/neatstudio.link-tracker/database/migrations/2026_08_12_400000_create_redirects_table.php index b0b1a08..0381671 100644 --- a/plugins/neatstudio.link-tracker/database/migrations/2026_08_12_400000_create_redirects_table.php +++ b/plugins/neatstudio.link-tracker/database/migrations/2026_08_12_400000_create_redirects_table.php @@ -24,10 +24,14 @@ return new class extends Migration $table->string('status', 20)->default('active'); // active / disabled $table->timestamp('last_clicked_at')->nullable(); $table->timestamps(); - - // MySQL 5.7 不支持对 TEXT 建全值索引,用前缀索引 - $table->index([DB::raw('target_url(191)')], 'redirects_target_url_index'); }); + + // MySQL 5.7 cannot index TEXT fully; SQLite does not support prefix indexes. + if (Schema::getConnection()->getDriverName() === 'mysql') { + Schema::table('redirects', function (Blueprint $table): void { + $table->index([DB::raw('target_url(191)')], 'redirects_target_url_index'); + }); + } } public function down(): void diff --git a/resources/views/list.blade.php b/resources/views/list.blade.php index f1a679f..81e1aa4 100644 --- a/resources/views/list.blade.php +++ b/resources/views/list.blade.php @@ -9,10 +9,10 @@

{{ $archiveTitle ?? ($category->name ?? '文章列表') }}

- @if(isset($category) && ($category->description || $category->getFirstMedia('cover'))) + @if(isset($category) && ($category->description || $category->coverImageUrl()))
- @if($cover = $category->getFirstMedia('cover')) - {{ $category->name }} + @if($url = $category->coverImageUrl()) + {{ $category->name }} @endif
@if($category->description) diff --git a/resources/views/membership/paywall.blade.php b/resources/views/membership/paywall.blade.php index a0bc9ef..2de6571 100644 --- a/resources/views/membership/paywall.blade.php +++ b/resources/views/membership/paywall.blade.php @@ -7,9 +7,9 @@ @endphp
- @if($cover = $post->getFirstMedia('cover')) + @if($url = $post->coverImageUrl())
- {{ $post->title }} + {{ $post->title }}
@endif diff --git a/resources/views/partials/post-card.blade.php b/resources/views/partials/post-card.blade.php index 3f314f8..9087b87 100644 --- a/resources/views/partials/post-card.blade.php +++ b/resources/views/partials/post-card.blade.php @@ -1,7 +1,7 @@
- @if($cover = $post->getFirstMedia('cover')) +@if($url = $post->coverImageUrl()) - {{ $post->title }} + {{ $post->title }} @endif

diff --git a/resources/views/show.blade.php b/resources/views/show.blade.php index fa47e61..9c870e7 100644 --- a/resources/views/show.blade.php +++ b/resources/views/show.blade.php @@ -30,9 +30,9 @@ @endif - @if($cover = $post->getFirstMedia('cover')) + @if($url = $post->coverImageUrl())
- {{ $post->title }} + {{ $post->title }}
@endif

{{ $post->title }}

diff --git a/tests/Feature/AdminPagesTest.php b/tests/Feature/AdminPagesTest.php index 77b7b49..b22998c 100644 --- a/tests/Feature/AdminPagesTest.php +++ b/tests/Feature/AdminPagesTest.php @@ -50,6 +50,15 @@ class AdminPagesTest extends TestCase $this->actingAs($this->admin)->get('/admin/media')->assertOk(); } + public function test_media_library_resource_loads(): void + { + $this->actingAs($this->admin)->get('/admin/media-library')->assertOk(); + $this->actingAs($this->admin)->get('/admin/media-folders')->assertOk(); + $this->actingAs($this->admin)->get('/admin/posts/create') + ->assertOk() + ->assertSee('media:ID', false); + } + public function test_plugin_and_payment_pages_load(): void { $this->actingAs($this->admin)->get('/admin/plugins')->assertOk(); diff --git a/tests/Feature/MarkdownMediaLibraryTest.php b/tests/Feature/MarkdownMediaLibraryTest.php new file mode 100644 index 0000000..f4d249f --- /dev/null +++ b/tests/Feature/MarkdownMediaLibraryTest.php @@ -0,0 +1,113 @@ +createLibraryImage(12, 'Hero shot'); + $post = Post::query()->create([ + 'user_id' => User::factory()->create()->id, + 'title' => 'Media embed post', + 'slug' => 'media-embed-post', + 'content' => "Intro\n\n![Hero shot](media:{$media->id})\n", + 'content_format' => 'markdown', + 'status' => 'published', + 'published_at' => now()->subMinute(), + ]); + + $html = app(PostContentRenderer::class)->render($post); + + $this->assertStringContainsString((string) $media->url, $html); + $this->assertStringContainsString('assertStringNotContainsString('media:'.$media->id, $html); + $this->assertStringContainsString("![Hero shot](media:{$media->id})", (string) $post->fresh()->content); + } + + public function test_html_body_hydrates_media_shortcode(): void + { + $media = $this->createLibraryImage(21, 'Inline'); + $post = Post::query()->create([ + 'title' => 'HTML media post', + 'content' => '

see [media='.$media->id.']

', + 'content_format' => 'html', + 'status' => 'published', + 'published_at' => now()->subMinute(), + ]); + + $html = app(PostContentRenderer::class)->render($post); + + $this->assertStringContainsString((string) $media->url, $html); + $this->assertStringNotContainsString('[media='.$media->id.']', $html); + } + + public function test_published_post_page_shows_library_image(): void + { + $media = $this->createLibraryImage(33, 'Cover art'); + $post = Post::query()->create([ + 'title' => 'Visible media post', + 'slug' => 'visible-media-post', + 'content' => "![Cover art](media:{$media->id})", + 'content_format' => 'markdown', + 'status' => 'published', + 'published_at' => now()->subMinute(), + 'cover_media_id' => $media->id, + ]); + + $this->get('/posts/'.$post->slug.'.shtml') + ->assertOk() + ->assertSee((string) $media->url, false) + ->assertDontSee('media:'.$media->id, false); + + $this->assertSame((string) $media->url, $post->fresh()->coverImageUrl()); + } + + public function test_missing_media_reference_does_not_crash_render(): void + { + $post = Post::query()->create([ + 'title' => 'Broken media post', + 'content' => '![gone](media:99999)', + 'content_format' => 'markdown', + 'status' => 'published', + 'published_at' => now()->subMinute(), + ]); + + $html = app(PostContentRenderer::class)->render($post); + + $this->assertIsString($html); + $this->assertStringContainsString('media:99999', $html); + } + + private function createLibraryImage(int $id, string $alt): MediaLibrary + { + $media = new MediaLibrary; + $media->forceFill([ + 'id' => $id, + 'disk' => 'public', + 'path' => 'media/library/articles/image/test-'.$id.'.jpg', + 'original_name' => 'test-'.$id.'.jpg', + 'extension' => 'jpg', + 'mime_type' => 'image/jpeg', + 'size' => 128, + 'type' => MediaLibrary::TYPE_IMAGE, + 'source' => MediaLibrary::SOURCE_ADMIN, + 'folder' => 'articles', + 'alt_text' => $alt, + ]); + $media->save(); + + return $media->fresh(); + } +} diff --git a/tests/Unit/MarkdownMediaEmbedTest.php b/tests/Unit/MarkdownMediaEmbedTest.php new file mode 100644 index 0000000..4aa9787 --- /dev/null +++ b/tests/Unit/MarkdownMediaEmbedTest.php @@ -0,0 +1,57 @@ + 'Hero shot', + 'type' => MediaLibrary::TYPE_IMAGE, + 'mime_type' => 'image/jpeg', + 'original_name' => 'hero.jpg', + 'path' => 'media/library/articles/hero.jpg', + ]); + $media->id = 12; + + $snippet = app(MarkdownMediaEmbed::class)->snippet($media, 'markdown'); + + $this->assertSame('![Hero shot](media:12)', $snippet); + $this->assertStringNotContainsString('http', $snippet); + $this->assertStringNotContainsString('/storage/', $snippet); + } + + public function test_markdown_file_snippet_is_a_link_reference(): void + { + $media = new MediaLibrary([ + 'alt_text' => '', + 'type' => MediaLibrary::TYPE_FILE, + 'mime_type' => 'application/pdf', + 'original_name' => 'notes.pdf', + 'path' => 'media/library/articles/notes.pdf', + ]); + $media->id = 8; + + $this->assertSame('[notes.pdf](media:8)', app(MarkdownMediaEmbed::class)->snippet($media, 'markdown')); + } + + public function test_html_snippet_uses_shortcode(): void + { + $media = new MediaLibrary([ + 'type' => MediaLibrary::TYPE_IMAGE, + 'mime_type' => 'image/png', + 'original_name' => 'pic.png', + 'path' => 'pic.png', + ]); + $media->id = 3; + + $this->assertSame('[media=3]', app(MarkdownMediaEmbed::class)->snippet($media, 'html')); + } +} diff --git a/themes/sablog/views/list.blade.php b/themes/sablog/views/list.blade.php index 0b583a1..aea5daa 100644 --- a/themes/sablog/views/list.blade.php +++ b/themes/sablog/views/list.blade.php @@ -9,10 +9,10 @@

{{ $archiveTitle ?? ($category->name ?? '文章列表') }}

- @if(isset($category) && ($category->description || $category->getFirstMedia('cover'))) + @if(isset($category) && ($category->description || $category->coverImageUrl()))
- @if($cover = $category->getFirstMedia('cover')) - {{ $category->name }} + @if($url = $category->coverImageUrl()) + {{ $category->name }} @endif
@if($category->description) diff --git a/themes/sablog/views/show.blade.php b/themes/sablog/views/show.blade.php index def26bb..45def55 100644 --- a/themes/sablog/views/show.blade.php +++ b/themes/sablog/views/show.blade.php @@ -30,8 +30,8 @@ @endif - @if($cover = $post->getFirstMedia('cover')) -
{{ $post->title }}
+ @if($url = $post->coverImageUrl()) +
{{ $post->title }}
@endif

{{ $post->title }}