feat: introducing flexible cache to improve performance (#754)

This commit is contained in:
Kyrch authored and GitHub committed 2024-10-22 12:10:44 -03:00
1 parent 0e6a401154
commit 3ce9bb09b7
55 files changed
+889 -373

No files matched your search

+2
View File
@@ -6,6 +6,8 @@ API_URL=
APP_NAME=AnimeThemes
APP_ENV=local
APP_DEBUG=true
DEBUGBAR_ENABLED=true
DEBUGBAR_EDITOR=
APP_URL=http://localhost
ASSET_URL=null
APP_KEY=
+2
View File
@@ -6,6 +6,8 @@ API_URL=
APP_NAME=AnimeThemes
APP_ENV=local
APP_DEBUG=true
DEBUGBAR_ENABLED=true
DEBUGBAR_EDITOR=
APP_URL=http://localhost
ASSET_URL=null
APP_KEY=
@@ -65,7 +65,7 @@ class DiscordVideoNotificationAction
Arr::set($videoArray, Video::ATTRIBUTE_OVERLAP, $video->overlap->localize());
Arr::set($videoArray, 'animethemeentries.0.animetheme.type', $theme->type->localize());
foreach ($videoArray['animethemeentries.0.animetheme.anime.images'] as $key => $image) {
foreach (Arr::get($videoArray, 'animethemeentries.0.animetheme.anime.images') as $key => $image) {
Arr::set($videoArray, "animethemeentries.0.animetheme.anime.images.$key.facet", $anime->images->get($key)->facet->localize());
}
@@ -9,6 +9,7 @@ use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
/**
* Class BaseStoreExternalProfileAction.
@@ -22,18 +23,18 @@ abstract class BaseStoreExternalProfileAction
*
* @param ExternalProfileSite $profileSite
* @param array $entries
* @return void
* @return void
*/
protected function preloadResources(ExternalProfileSite $profileSite, array $entries): void
{
$externalResources = ExternalResource::query()
->where(ExternalResource::ATTRIBUTE_SITE, $profileSite->getResourceSite()->value)
->whereIn(ExternalResource::ATTRIBUTE_EXTERNAL_ID, Arr::pluck($entries, 'external_id'))
->with(ExternalResource::RELATION_ANIME)
->get()
->mapWithKeys(fn (ExternalResource $resource) => [$resource->external_id => $resource->anime]);
$this->resources = $externalResources;
$this->resources = Cache::flexible("externalprofile_resources", [60, 300], function () use ($profileSite, $entries) {
return ExternalResource::query()
->where(ExternalResource::ATTRIBUTE_SITE, $profileSite->getResourceSite()->value)
->whereIn(ExternalResource::ATTRIBUTE_EXTERNAL_ID, Arr::pluck($entries, 'external_id'))
->with(ExternalResource::RELATION_ANIME)
->get()
->mapWithKeys(fn (ExternalResource $resource) => [$resource->external_id => $resource->anime]);
});
}
/**
@@ -8,6 +8,7 @@ use App\Actions\Models\Wiki\ApiAction;
use App\Enums\Models\Wiki\AnimeSynonymType;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Arr;
@@ -31,7 +32,7 @@ class AnilistAnimeApiAction extends ApiAction
/**
* Set the response after the request.
*
* @param BelongsToMany<ExternalResource> $resources
* @param BelongsToMany<ExternalResource, Anime> $resources
* @return static
*/
public function handle(BelongsToMany $resources): static
@@ -127,7 +128,7 @@ class AnilistAnimeApiAction extends ApiAction
/**
* Get the available sites to backfill.
*
*
* @return array
*/
protected function getResourcesMapping(): array
@@ -6,6 +6,7 @@ namespace App\Actions\Models\Wiki\Anime\ApiAction;
use App\Actions\Models\Wiki\ApiAction;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Arr;
@@ -29,7 +30,7 @@ class JikanAnimeApiAction extends ApiAction
/**
* Set the response after the request.
*
* @param BelongsToMany<ExternalResource> $resources
* @param BelongsToMany<ExternalResource, Anime> $resources
* @return static
*/
public function handle(BelongsToMany $resources): static
@@ -78,7 +79,7 @@ class JikanAnimeApiAction extends ApiAction
/**
* Get the available sites to backfill.
*
*
* @return array
*/
protected function getResourcesMapping(): array
@@ -6,6 +6,7 @@ namespace App\Actions\Models\Wiki\Anime\ApiAction;
use App\Actions\Models\Wiki\ApiAction;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Facades\Http;
@@ -28,7 +29,7 @@ class LivechartAnimeApiAction extends ApiAction
/**
* Set the response after the request.
*
* @param BelongsToMany<ExternalResource> $resources
* @param BelongsToMany<ExternalResource, Anime> $resources
* @return static
*/
public function handle(BelongsToMany $resources): static
@@ -6,6 +6,7 @@ namespace App\Actions\Models\Wiki\Anime\ApiAction;
use App\Actions\Models\Wiki\ApiAction;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Arr;
@@ -30,7 +31,7 @@ class MalAnimeApiAction extends ApiAction
/**
* Set the response after the request.
*
* @param BelongsToMany<ExternalResource> $resources
* @param BelongsToMany<ExternalResource, Anime> $resources
* @return static
*/
public function handle(BelongsToMany $resources): static
+5 -1
View File
@@ -5,7 +5,11 @@ declare(strict_types=1);
namespace App\Actions\Models\Wiki;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\BaseModel;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use App\Models\Wiki\Studio;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Arr;
@@ -39,7 +43,7 @@ abstract class ApiAction
/**
* Set the response after the request.
*
* @param BelongsToMany<ExternalResource> $resources
* @param BelongsToMany $resources
* @return static
*/
abstract public function handle(BelongsToMany $resources): static;
@@ -8,6 +8,7 @@ use App\Actions\Models\Wiki\ApiAction;
use App\Enums\Models\Wiki\ImageFacet;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\Wiki\ExternalResource;
use App\Models\Wiki\Studio;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
/**
@@ -28,7 +29,7 @@ class MalStudioApiAction extends ApiAction
/**
* Set the response after the request.
*
* @param BelongsToMany<ExternalResource> $resources
* @param BelongsToMany<ExternalResource, Studio> $resources
* @return static
*/
public function handle(BelongsToMany $resources): static
@@ -128,15 +128,15 @@ class UploadVideoTableAction extends UploadTableAction
->label(__('filament.fields.video.overlap.name'))
->helperText(__('filament.fields.video.overlap.help'))
->options(VideoOverlap::asSelectArray())
->nullable()
->rules(['nullable', new Enum(VideoOverlap::class)]),
->required()
->rules(['required', new Enum(VideoOverlap::class)]),
Select::make(Video::ATTRIBUTE_SOURCE)
->label(__('filament.fields.video.source.name'))
->helperText(__('filament.fields.video.source.help'))
->options(VideoSource::asSelectArray())
->nullable()
->rules(['nullable', new Enum(VideoSource::class)]),
->required()
->rules(['required', new Enum(VideoSource::class)]),
],
)
),
+7 -2
View File
@@ -6,6 +6,7 @@ namespace App\Filament\Tabs;
use Filament\Resources\Components\Tab;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Cache;
/**
* Class BaseTab.
@@ -41,7 +42,9 @@ abstract class BaseTab extends Tab
*/
public function modifyQuery(Builder $query): Builder
{
return $this->modifyQuery($query);
return Cache::flexible("filament_query_{$this->getKey()}", [15, 60], function () use ($query) {
return $this->modifyQuery($query);
});
}
/**
@@ -51,7 +54,9 @@ abstract class BaseTab extends Tab
*/
public function getBadge(): int
{
return $this->getBadge();
return Cache::flexible("filament_badge_{$this->getKey()}", [15, 60], function () {
return $this->getBadge();
});
}
/**
+8 -5
View File
@@ -6,6 +6,7 @@ namespace App\Filament\Widgets;
use Flowframe\Trend\Trend;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Leandrocfe\FilamentApexCharts\Widgets\ApexChartWidget;
/**
@@ -17,16 +18,18 @@ class BaseChartWidget extends ApexChartWidget
/**
* Get the resources count created per month.
*
*
* @param class-string $model
* @return Collection
*/
protected function perMonth(string $model): Collection
{
return Trend::model($model)
->between(now()->addMonths(-11)->startOfMonth(), now()->endOfMonth())
->perMonth()
->count();
return Cache::flexible("filament_chart_$model", [300, 1200], function () use ($model) {
return Trend::model($model)
->between(now()->addMonths(-11)->startOfMonth(), now()->endOfMonth())
->perMonth()
->count();
});
}
/**
+2 -2
View File
@@ -20,7 +20,7 @@ use Throwable;
/**
* Class ActionLog.
*
*
* @property int $id
* @property string $batch_id
* @property string $name
@@ -145,7 +145,7 @@ class ActionLog extends Model implements Nameable, HasSubtitle
/**
* Get the user that initiated the action.
*
* @return BelongsTo<User, ActionLog>
* @return BelongsTo<User, $this>
*/
public function user(): BelongsTo
{
+3 -3
View File
@@ -134,7 +134,7 @@ class FeaturedTheme extends BaseModel
/**
* Get the user that recommended the featured theme.
*
* @return BelongsTo<User, FeaturedTheme>
* @return BelongsTo<User, $this>
*/
public function user(): BelongsTo
{
@@ -144,7 +144,7 @@ class FeaturedTheme extends BaseModel
/**
* Get the entry for the featured video.
*
* @return BelongsTo<AnimeThemeEntry, FeaturedTheme>
* @return BelongsTo<AnimeThemeEntry, $this>
*/
public function animethemeentry(): BelongsTo
{
@@ -154,7 +154,7 @@ class FeaturedTheme extends BaseModel
/**
* Get the video to feature.
*
* @return BelongsTo<Video, FeaturedTheme>
* @return BelongsTo<Video, $this>
*/
public function video(): BelongsTo
{
+3 -3
View File
@@ -221,7 +221,7 @@ class User extends Authenticatable implements MustVerifyEmail, Nameable, HasSubt
/**
* Get the playlists that belong to the user.
*
* @return HasMany<Playlist>
* @return HasMany<Playlist, $this>
*/
public function playlists(): HasMany
{
@@ -231,7 +231,7 @@ class User extends Authenticatable implements MustVerifyEmail, Nameable, HasSubt
/**
* Get the playlists that belong to the user.
*
* @return HasMany<ExternalProfile>
* @return HasMany<ExternalProfile, $this>
*/
public function externalprofiles(): HasMany
{
@@ -241,7 +241,7 @@ class User extends Authenticatable implements MustVerifyEmail, Nameable, HasSubt
/**
* Get the action logs that the user has executed.
*
* @return HasMany<ActionLog>
* @return HasMany<ActionLog, $this>
*/
public function actionlogs(): HasMany
{
+1 -1
View File
@@ -105,7 +105,7 @@ class DiscordThread extends BaseModel
/**
* Gets the anime that the thread uses.
*
* @return BelongsTo<Anime, DiscordThread>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
+2 -2
View File
@@ -133,7 +133,7 @@ class ExternalEntry extends BaseModel
/**
* Get the anime that owns the user external entry.
*
* @return BelongsTo<Anime, ExternalEntry>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
@@ -143,7 +143,7 @@ class ExternalEntry extends BaseModel
/**
* Get the user profile that owns the user profile.
*
* @return BelongsTo<ExternalProfile, ExternalEntry>
* @return BelongsTo<ExternalProfile, $this>
*/
public function externalprofile(): BelongsTo
{
+1 -1
View File
@@ -118,7 +118,7 @@ class ExternalToken extends BaseModel
/**
* Get the external profile that owns the external token.
*
* @return BelongsTo<ExternalProfile, ExternalToken>
* @return BelongsTo<ExternalProfile, $this>
*/
public function externalprofile(): BelongsTo
{
+4 -4
View File
@@ -38,7 +38,7 @@ use Illuminate\Support\Facades\Date;
* @property int|null $user_id
* @property User|null $user
* @property ExternalProfileVisibility $visibility
*
*
* @method static ExternalProfileFactory factory(...$parameters)
*/
class ExternalProfile extends BaseModel
@@ -190,7 +190,7 @@ class ExternalProfile extends BaseModel
/**
* Get the entries for the profile.
*
* @return HasMany<ExternalEntry>
* @return HasMany<ExternalEntry, $this>
*/
public function externalentries(): HasMany
{
@@ -200,7 +200,7 @@ class ExternalProfile extends BaseModel
/**
* Get the user that owns the profile.
*
* @return BelongsTo<User, ExternalProfile>
* @return BelongsTo<User, $this>
*/
public function user(): BelongsTo
{
@@ -210,7 +210,7 @@ class ExternalProfile extends BaseModel
/**
* Get the external token that the external profile owns.
*
* @return HasOne<ExternalToken>
* @return HasOne<ExternalToken, $this>
*/
public function externaltoken(): HasOne
{
+5 -5
View File
@@ -175,7 +175,7 @@ class Playlist extends BaseModel implements HasHashids, Viewable
/**
* Get the user that owns the playlist.
*
* @return BelongsTo<User, Playlist>
* @return BelongsTo<User, $this>
*/
public function user(): BelongsTo
{
@@ -185,7 +185,7 @@ class Playlist extends BaseModel implements HasHashids, Viewable
/**
* Get the first track of the playlist.
*
* @return BelongsTo<PlaylistTrack, Playlist>
* @return BelongsTo<PlaylistTrack, $this>
*/
public function first(): BelongsTo
{
@@ -195,7 +195,7 @@ class Playlist extends BaseModel implements HasHashids, Viewable
/**
* Get the last track of the playlist.
*
* @return BelongsTo<PlaylistTrack, Playlist>
* @return BelongsTo<PlaylistTrack, $this>
*/
public function last(): BelongsTo
{
@@ -205,7 +205,7 @@ class Playlist extends BaseModel implements HasHashids, Viewable
/**
* Get the images for the playlist.
*
* @return BelongsToMany<Image>
* @return BelongsToMany<Image, $this>
*/
public function images(): BelongsToMany
{
@@ -218,7 +218,7 @@ class Playlist extends BaseModel implements HasHashids, Viewable
/**
* Get the tracks that comprise the playlist.
*
* @return HasMany<PlaylistTrack>
* @return HasMany<PlaylistTrack, $this>
*/
public function tracks(): HasMany
{
+5 -5
View File
@@ -156,7 +156,7 @@ class PlaylistTrack extends BaseModel implements HasHashids
/**
* Get the entry of the track.
*
* @return BelongsTo<AnimeThemeEntry, PlaylistTrack>
* @return BelongsTo<AnimeThemeEntry, $this>
*/
public function animethemeentry(): BelongsTo
{
@@ -166,7 +166,7 @@ class PlaylistTrack extends BaseModel implements HasHashids
/**
* Get the playlist the track belongs to.
*
* @return BelongsTo<Playlist, PlaylistTrack>
* @return BelongsTo<Playlist, $this>
*/
public function playlist(): BelongsTo
{
@@ -176,7 +176,7 @@ class PlaylistTrack extends BaseModel implements HasHashids
/**
* Get the previous track.
*
* @return BelongsTo<PlaylistTrack, PlaylistTrack>
* @return BelongsTo<PlaylistTrack, $this>
*/
public function previous(): BelongsTo
{
@@ -186,7 +186,7 @@ class PlaylistTrack extends BaseModel implements HasHashids
/**
* Get the next track.
*
* @return BelongsTo<PlaylistTrack, PlaylistTrack>
* @return BelongsTo<PlaylistTrack, $this>
*/
public function next(): BelongsTo
{
@@ -196,7 +196,7 @@ class PlaylistTrack extends BaseModel implements HasHashids
/**
* Get the video of the track.
*
* @return BelongsTo<Video, PlaylistTrack>
* @return BelongsTo<Video, $this>
*/
public function video(): BelongsTo
{
+8 -8
View File
@@ -199,7 +199,7 @@ class Anime extends BaseModel
/**
* Get the synonyms for the anime.
*
* @return HasMany<AnimeSynonym>
* @return HasMany<AnimeSynonym, $this>
*/
public function animesynonyms(): HasMany
{
@@ -209,7 +209,7 @@ class Anime extends BaseModel
/**
* Get the discord thread that the anime owns.
*
* @return HasOne<DiscordThread>
* @return HasOne<DiscordThread, $this>
*/
public function discordthread(): HasOne
{
@@ -219,7 +219,7 @@ class Anime extends BaseModel
/**
* Get the series the anime is included in.
*
* @return BelongsToMany<Series>
* @return BelongsToMany<Series, $this>
*/
public function series(): BelongsToMany
{
@@ -232,7 +232,7 @@ class Anime extends BaseModel
/**
* Get the themes for the anime.
*
* @return HasMany<AnimeTheme>
* @return HasMany<AnimeTheme, $this>
*/
public function animethemes(): HasMany
{
@@ -242,7 +242,7 @@ class Anime extends BaseModel
/**
* Get the resources for the anime.
*
* @return BelongsToMany<ExternalResource>
* @return BelongsToMany<ExternalResource, $this>
*/
public function resources(): BelongsToMany
{
@@ -256,7 +256,7 @@ class Anime extends BaseModel
/**
* Get the images for the anime.
*
* @return BelongsToMany<Image>
* @return BelongsToMany<Image, $this>
*/
public function images(): BelongsToMany
{
@@ -269,7 +269,7 @@ class Anime extends BaseModel
/**
* Get the studios that produced the anime.
*
* @return BelongsToMany<Studio>
* @return BelongsToMany<Studio, $this>
*/
public function studios(): BelongsToMany
{
@@ -282,7 +282,7 @@ class Anime extends BaseModel
/**
* Get the entries for the anime.
*
* @return HasMany<ExternalEntry>
* @return HasMany<ExternalEntry, $this>
*/
public function externalentries(): HasMany
{
+1 -1
View File
@@ -114,7 +114,7 @@ class AnimeSynonym extends BaseModel
/**
* Gets the anime that owns the synonym.
*
* @return BelongsTo<Anime, AnimeSynonym>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
+4 -4
View File
@@ -178,7 +178,7 @@ class AnimeTheme extends BaseModel
/**
* Gets the anime that owns the theme.
*
* @return BelongsTo<Anime, AnimeTheme>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
@@ -188,7 +188,7 @@ class AnimeTheme extends BaseModel
/**
* Gets the group that the theme uses.
*
* @return BelongsTo<Group, AnimeTheme>
* @return BelongsTo<Group, $this>
*/
public function group(): BelongsTo
{
@@ -198,7 +198,7 @@ class AnimeTheme extends BaseModel
/**
* Gets the song that the theme uses.
*
* @return BelongsTo<Song, AnimeTheme>
* @return BelongsTo<Song, $this>
*/
public function song(): BelongsTo
{
@@ -208,7 +208,7 @@ class AnimeTheme extends BaseModel
/**
* Get the entries for the theme.
*
* @return HasMany<AnimeThemeEntry>
* @return HasMany<AnimeThemeEntry, $this>
*/
public function animethemeentries(): HasMany
{
@@ -178,7 +178,7 @@ class AnimeThemeEntry extends BaseModel
/**
* Get the theme that owns the entry.
*
* @return BelongsTo<AnimeTheme, AnimeThemeEntry>
* @return BelongsTo<AnimeTheme, $this>
*/
public function animetheme(): BelongsTo
{
@@ -188,7 +188,7 @@ class AnimeThemeEntry extends BaseModel
/**
* Get the videos linked in the theme entry.
*
* @return BelongsToMany<Video>
* @return BelongsToMany<Video, $this>
*/
public function videos(): BelongsToMany
{
+5 -5
View File
@@ -153,7 +153,7 @@ class Artist extends BaseModel
/**
* Get the songs the artist has performed in.
*
* @return BelongsToMany<Song>
* @return BelongsToMany<Song, $this>
*/
public function songs(): BelongsToMany
{
@@ -167,7 +167,7 @@ class Artist extends BaseModel
/**
* Get the resources for the artist.
*
* @return BelongsToMany<ExternalResource>
* @return BelongsToMany<ExternalResource, $this>
*/
public function resources(): BelongsToMany
{
@@ -181,7 +181,7 @@ class Artist extends BaseModel
/**
* Get the members that comprise this group.
*
* @return BelongsToMany<Artist>
* @return BelongsToMany<Artist, $this>
*/
public function members(): BelongsToMany
{
@@ -195,7 +195,7 @@ class Artist extends BaseModel
/**
* Get the groups the artist has performed in.
*
* @return BelongsToMany<Artist>
* @return BelongsToMany<Artist, $this>
*/
public function groups(): BelongsToMany
{
@@ -209,7 +209,7 @@ class Artist extends BaseModel
/**
* Get the images for the artist.
*
* @return BelongsToMany<Image>
* @return BelongsToMany<Image, $this>
*/
public function images(): BelongsToMany
{
+1 -1
View File
@@ -173,7 +173,7 @@ class Audio extends BaseModel implements Streamable, Viewable
/**
* Get the videos that use this audio.
*
* @return HasMany<Video>
* @return HasMany<Video, $this>
*/
public function videos(): HasMany
{
+4 -4
View File
@@ -125,7 +125,7 @@ class ExternalResource extends BaseModel
/**
* Get the anime that reference this resource.
*
* @return BelongsToMany<Anime>
* @return BelongsToMany<Anime, $this>
*/
public function anime(): BelongsToMany
{
@@ -139,7 +139,7 @@ class ExternalResource extends BaseModel
/**
* Get the artists that reference this resource.
*
* @return BelongsToMany<Artist>
* @return BelongsToMany<Artist, $this>
*/
public function artists(): BelongsToMany
{
@@ -153,7 +153,7 @@ class ExternalResource extends BaseModel
/**
* Get the song that reference this resource.
*
* @return BelongsToMany<Song>
* @return BelongsToMany<Song, $this>
*/
public function songs(): BelongsToMany
{
@@ -167,7 +167,7 @@ class ExternalResource extends BaseModel
/**
* Get the studios that reference this resource.
*
* @return BelongsToMany<Studio>
* @return BelongsToMany<Studio, $this>
*/
public function studios(): BelongsToMany
{
+2 -2
View File
@@ -22,7 +22,7 @@ use Illuminate\Support\Collection;
* @property int $group_id
* @property string $name
* @property string $slug
*
*
* @method static GroupFactory factory(...$parameters)
*/
class Group extends BaseModel
@@ -99,7 +99,7 @@ class Group extends BaseModel
/**
* Get the themes for the group.
*
* @return HasMany<AnimeTheme>
* @return HasMany<AnimeTheme, $this>
*/
public function animethemes(): HasMany
{
+4 -4
View File
@@ -126,7 +126,7 @@ class Image extends BaseModel
/**
* Get the anime that use this image.
*
* @return BelongsToMany<Anime>
* @return BelongsToMany<Anime, $this>
*/
public function anime(): BelongsToMany
{
@@ -139,7 +139,7 @@ class Image extends BaseModel
/**
* Get the artists that use this image.
*
* @return BelongsToMany<Artist>
* @return BelongsToMany<Artist, $this>
*/
public function artists(): BelongsToMany
{
@@ -152,7 +152,7 @@ class Image extends BaseModel
/**
* Get the studios that use this image.
*
* @return BelongsToMany<Studio>
* @return BelongsToMany<Studio, $this>
*/
public function studios(): BelongsToMany
{
@@ -165,7 +165,7 @@ class Image extends BaseModel
/**
* Get the playlists that use this image.
*
* @return BelongsToMany<Playlist>
* @return BelongsToMany<Playlist, $this>
*/
public function playlists(): BelongsToMany
{
+1 -1
View File
@@ -111,7 +111,7 @@ class Series extends BaseModel
/**
* Get the anime included in the series.
*
* @return BelongsToMany<Anime>
* @return BelongsToMany<Anime, $this>
*/
public function anime(): BelongsToMany
{
+3 -3
View File
@@ -115,7 +115,7 @@ class Song extends BaseModel
/**
* Get the anime themes that use this song.
*
* @return HasMany<AnimeTheme>
* @return HasMany<AnimeTheme, $this>
*/
public function animethemes(): HasMany
{
@@ -125,7 +125,7 @@ class Song extends BaseModel
/**
* Get the artists included in the performance.
*
* @return BelongsToMany<Artist>
* @return BelongsToMany<Artist, $this>
*/
public function artists(): BelongsToMany
{
@@ -139,7 +139,7 @@ class Song extends BaseModel
/**
* Get the resources for the song.
*
* @return BelongsToMany<ExternalResource>
* @return BelongsToMany<ExternalResource, $this>
*/
public function resources(): BelongsToMany
{
+3 -3
View File
@@ -118,7 +118,7 @@ class Studio extends BaseModel
/**
* Get the anime that the studio produced.
*
* @return BelongsToMany<Anime>
* @return BelongsToMany<Anime, $this>
*/
public function anime(): BelongsToMany
{
@@ -131,7 +131,7 @@ class Studio extends BaseModel
/**
* Get the resources for the studio.
*
* @return BelongsToMany<ExternalResource>
* @return BelongsToMany<ExternalResource, $this>
*/
public function resources(): BelongsToMany
{
@@ -145,7 +145,7 @@ class Studio extends BaseModel
/**
* Get the images for the studio.
*
* @return BelongsToMany<Image>
* @return BelongsToMany<Image, $this>
*/
public function images(): BelongsToMany
{
+4 -4
View File
@@ -326,7 +326,7 @@ class Video extends BaseModel implements Streamable, Viewable
/**
* Get the related entries.
*
* @return BelongsToMany<AnimeThemeEntry>
* @return BelongsToMany<AnimeThemeEntry, $this>
*/
public function animethemeentries(): BelongsToMany
{
@@ -339,7 +339,7 @@ class Video extends BaseModel implements Streamable, Viewable
/**
* Gets the audio that the video uses.
*
* @return BelongsTo<Audio, Video>
* @return BelongsTo<Audio, $this>
*/
public function audio(): BelongsTo
{
@@ -349,7 +349,7 @@ class Video extends BaseModel implements Streamable, Viewable
/**
* Get the script that the video owns.
*
* @return HasOne<VideoScript>
* @return HasOne<VideoScript, $this>
*/
public function videoscript(): HasOne
{
@@ -359,7 +359,7 @@ class Video extends BaseModel implements Streamable, Viewable
/**
* Get the tracks that use this video.
*
* @return HasMany<PlaylistTrack>
* @return HasMany<PlaylistTrack, $this>
*/
public function tracks(): HasMany
{
+1 -1
View File
@@ -94,7 +94,7 @@ class VideoScript extends BaseModel
/**
* Get the video that owns the script.
*
* @return BelongsTo<Video, VideoScript>
* @return BelongsTo<Video, $this>
*/
public function video(): BelongsTo
{
+2 -2
View File
@@ -77,7 +77,7 @@ class PlaylistImage extends BasePivot
/**
* Gets the playlist that owns the playlist image.
*
* @return BelongsTo<Playlist, PlaylistImage>
* @return BelongsTo<Playlist, $this>
*/
public function playlist(): BelongsTo
{
@@ -87,7 +87,7 @@ class PlaylistImage extends BasePivot
/**
* Gets the image that owns the playlist image.
*
* @return BelongsTo<Image, PlaylistImage>
* @return BelongsTo<Image, $this>
*/
public function image(): BelongsTo
{
+2 -2
View File
@@ -77,7 +77,7 @@ class AnimeImage extends BasePivot
/**
* Gets the anime that owns the anime image.
*
* @return BelongsTo<Anime, AnimeImage>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
@@ -87,7 +87,7 @@ class AnimeImage extends BasePivot
/**
* Gets the image that owns the anime image.
*
* @return BelongsTo<Image, AnimeImage>
* @return BelongsTo<Image, $this>
*/
public function image(): BelongsTo
{
+2 -2
View File
@@ -82,7 +82,7 @@ class AnimeResource extends BasePivot
/**
* Gets the anime that owns the anime resource.
*
* @return BelongsTo<Anime, AnimeResource>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
@@ -92,7 +92,7 @@ class AnimeResource extends BasePivot
/**
* Gets the resource that owns the anime resource.
*
* @return BelongsTo<ExternalResource, AnimeResource>
* @return BelongsTo<ExternalResource, $this>
*/
public function resource(): BelongsTo
{
+2 -2
View File
@@ -77,7 +77,7 @@ class AnimeSeries extends BasePivot
/**
* Gets the anime that owns the anime series.
*
* @return BelongsTo<Anime, AnimeSeries>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
@@ -87,7 +87,7 @@ class AnimeSeries extends BasePivot
/**
* Gets the series that owns the anime series.
*
* @return BelongsTo<Series, AnimeSeries>
* @return BelongsTo<Series, $this>
*/
public function series(): BelongsTo
{
+2 -2
View File
@@ -77,7 +77,7 @@ class AnimeStudio extends BasePivot
/**
* Gets the anime that owns the anime studio.
*
* @return BelongsTo<Anime, AnimeStudio>
* @return BelongsTo<Anime, $this>
*/
public function anime(): BelongsTo
{
@@ -87,7 +87,7 @@ class AnimeStudio extends BasePivot
/**
* Gets the studio that owns the anime studio.
*
* @return BelongsTo<Studio, AnimeStudio>
* @return BelongsTo<Studio, $this>
*/
public function studio(): BelongsTo
{
+2 -2
View File
@@ -81,7 +81,7 @@ class AnimeThemeEntryVideo extends BasePivot
/**
* Gets the video that owns the video entry.
*
* @return BelongsTo<Video, AnimeThemeEntryVideo>
* @return BelongsTo<Video, $this>
*/
public function video(): BelongsTo
{
@@ -91,7 +91,7 @@ class AnimeThemeEntryVideo extends BasePivot
/**
* Gets the entry that owns the video entry.
*
* @return BelongsTo<AnimeThemeEntry, AnimeThemeEntryVideo>
* @return BelongsTo<AnimeThemeEntry, $this>
*/
public function animethemeentry(): BelongsTo
{
+2 -2
View File
@@ -77,7 +77,7 @@ class ArtistImage extends BasePivot
/**
* Gets the artist that owns the artist image.
*
* @return BelongsTo<Artist, ArtistImage>
* @return BelongsTo<Artist, $this>
*/
public function artist(): BelongsTo
{
@@ -87,7 +87,7 @@ class ArtistImage extends BasePivot
/**
* Gets the image that owns the artist image.
*
* @return BelongsTo<Image, ArtistImage>
* @return BelongsTo<Image, $this>
*/
public function image(): BelongsTo
{
+2 -2
View File
@@ -84,7 +84,7 @@ class ArtistMember extends BasePivot
/**
* Gets the artist that owns the artist member.
*
* @return BelongsTo<Artist, ArtistMember>
* @return BelongsTo<Artist, $this>
*/
public function artist(): BelongsTo
{
@@ -94,7 +94,7 @@ class ArtistMember extends BasePivot
/**
* Gets the member that owns the artist member.
*
* @return BelongsTo<Artist, ArtistMember>
* @return BelongsTo<Artist, $this>
*/
public function member(): BelongsTo
{
+2 -2
View File
@@ -82,7 +82,7 @@ class ArtistResource extends BasePivot
/**
* Gets the artist that owns the artist resource.
*
* @return BelongsTo<Artist, ArtistResource>
* @return BelongsTo<Artist, $this>
*/
public function artist(): BelongsTo
{
@@ -92,7 +92,7 @@ class ArtistResource extends BasePivot
/**
* Gets the resource that owns the artist resource.
*
* @return BelongsTo<ExternalResource, ArtistResource>
* @return BelongsTo<ExternalResource, $this>
*/
public function resource(): BelongsTo
{
+2 -2
View File
@@ -85,7 +85,7 @@ class ArtistSong extends BasePivot
/**
* Gets the artist that owns the artist song.
*
* @return BelongsTo<Artist, ArtistSong>
* @return BelongsTo<Artist, $this>
*/
public function artist(): BelongsTo
{
@@ -95,7 +95,7 @@ class ArtistSong extends BasePivot
/**
* Gets the song that owns the artist song.
*
* @return BelongsTo<Song, ArtistSong>
* @return BelongsTo<Song, $this>
*/
public function song(): BelongsTo
{
+2 -2
View File
@@ -82,7 +82,7 @@ class SongResource extends BasePivot
/**
* Gets the song that owns the anime resource.
*
* @return BelongsTo<Song, SongResource>
* @return BelongsTo<Song, $this>
*/
public function song(): BelongsTo
{
@@ -92,7 +92,7 @@ class SongResource extends BasePivot
/**
* Gets the resource that owns the anime resource.
*
* @return BelongsTo<ExternalResource, SongResource>
* @return BelongsTo<ExternalResource, $this>
*/
public function resource(): BelongsTo
{
+2 -2
View File
@@ -77,7 +77,7 @@ class StudioImage extends BasePivot
/**
* Gets the studio that owns the studio image.
*
* @return BelongsTo<Studio, StudioImage>
* @return BelongsTo<Studio, $this>
*/
public function studio(): BelongsTo
{
@@ -87,7 +87,7 @@ class StudioImage extends BasePivot
/**
* Gets the image that owns the studio image.
*
* @return BelongsTo<Image, StudioImage>
* @return BelongsTo<Image, $this>
*/
public function image(): BelongsTo
{
+2 -2
View File
@@ -82,7 +82,7 @@ class StudioResource extends BasePivot
/**
* Gets the studio that owns the studio resource.
*
* @return BelongsTo<Studio, StudioResource>
* @return BelongsTo<Studio, $this>
*/
public function studio(): BelongsTo
{
@@ -92,7 +92,7 @@ class StudioResource extends BasePivot
/**
* Gets the resource that owns the studio resource.
*
* @return BelongsTo<ExternalResource, StudioResource>
* @return BelongsTo<ExternalResource, $this>
*/
public function resource(): BelongsTo
{
+1
View File
@@ -57,6 +57,7 @@
"vinkla/hashids": "^12.0"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.14",
"brianium/paratest": "^7.0",
"larastan/larastan": "^2.9",
"laravel/pint": "^1.6",
Generated
+409 -247
View File
File diff suppressed because it is too large. Load diff
+329
View File
@@ -0,0 +1,329 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Debugbar Settings
|--------------------------------------------------------------------------
|
| Debugbar is enabled by default, when debug is set to true in app.php.
| You can override the value by setting enable to true or false instead of null.
|
| You can provide an array of URI's that must be ignored (eg. 'api/*')
|
*/
'enabled' => env('DEBUGBAR_ENABLED', false),
'hide_empty_tabs' => false, // Hide tabs until they have content
'except' => [
'telescope*',
'horizon*',
],
/*
|--------------------------------------------------------------------------
| Storage settings
|--------------------------------------------------------------------------
|
| DebugBar stores data for session/ajax requests.
| You can disable this, so the debugbar stores data in headers/session,
| but this can cause problems with large data collectors.
| By default, file storage (in the storage folder) is used. Redis and PDO
| can also be used. For PDO, run the package migrations first.
|
| Warning: Enabling storage.open will allow everyone to access previous
| request, do not enable open storage in publicly available environments!
| Specify a callback if you want to limit based on IP or authentication.
| Leaving it to null will allow localhost only.
*/
'storage' => [
'enabled' => true,
'open' => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback.
'driver' => 'file', // redis, file, pdo, socket, custom
'path' => storage_path('debugbar'), // For file driver
'connection' => null, // Leave null for default connection (Redis/PDO)
'provider' => '', // Instance of StorageInterface for custom driver
'hostname' => '127.0.0.1', // Hostname to use with the "socket" driver
'port' => 2304, // Port to use with the "socket" driver
],
/*
|--------------------------------------------------------------------------
| Editor
|--------------------------------------------------------------------------
|
| Choose your preferred editor to use when clicking file name.
|
| Supported: "phpstorm", "vscode", "vscode-insiders", "vscode-remote",
| "vscode-insiders-remote", "vscodium", "textmate", "emacs",
| "sublime", "atom", "nova", "macvim", "idea", "netbeans",
| "xdebug", "espresso"
|
*/
'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'),
/*
|--------------------------------------------------------------------------
| Remote Path Mapping
|--------------------------------------------------------------------------
|
| If you are using a remote dev server, like Laravel Homestead, Docker, or
| even a remote VPS, it will be necessary to specify your path mapping.
|
| Leaving one, or both of these, empty or null will not trigger the remote
| URL changes and Debugbar will treat your editor links as local files.
|
| "remote_sites_path" is an absolute base path for your sites or projects
| in Homestead, Vagrant, Docker, or another remote development server.
|
| Example value: "/home/vagrant/Code"
|
| "local_sites_path" is an absolute base path for your sites or projects
| on your local computer where your IDE or code editor is running on.
|
| Example values: "/Users/<name>/Code", "C:\Users\<name>\Documents\Code"
|
*/
'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'),
'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')),
/*
|--------------------------------------------------------------------------
| Vendors
|--------------------------------------------------------------------------
|
| Vendor files are included by default, but can be set to false.
| This can also be set to 'js' or 'css', to only include javascript or css vendor files.
| Vendor files are for css: font-awesome (including fonts) and highlight.js (css files)
| and for js: jquery and highlight.js
| So if you want syntax highlighting, set it to true.
| jQuery is set to not conflict with existing jQuery scripts.
|
*/
'include_vendors' => true,
/*
|--------------------------------------------------------------------------
| Capture Ajax Requests
|--------------------------------------------------------------------------
|
| The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),
| you can use this option to disable sending the data through the headers.
|
| Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.
|
| Note for your request to be identified as ajax requests they must either send the header
| X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header.
|
| By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar.
| Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading.
*/
'capture_ajax' => true,
'add_ajax_timing' => false,
'ajax_handler_auto_show' => true,
'ajax_handler_enable_tab' => true,
/*
|--------------------------------------------------------------------------
| Custom Error Handler for Deprecated warnings
|--------------------------------------------------------------------------
|
| When enabled, the Debugbar shows deprecated warnings for Symfony components
| in the Messages tab.
|
*/
'error_handler' => false,
/*
|--------------------------------------------------------------------------
| Clockwork integration
|--------------------------------------------------------------------------
|
| The Debugbar can emulate the Clockwork headers, so you can use the Chrome
| Extension, without the server-side code. It uses Debugbar collectors instead.
|
*/
'clockwork' => false,
/*
|--------------------------------------------------------------------------
| DataCollectors
|--------------------------------------------------------------------------
|
| Enable/disable DataCollectors
|
*/
'collectors' => [
'phpinfo' => true, // Php version
'messages' => true, // Messages
'time' => true, // Time Datalogger
'memory' => true, // Memory usage
'exceptions' => true, // Exception displayer
'log' => true, // Logs from Monolog (merged in messages if enabled)
'db' => true, // Show database (PDO) queries and bindings
'views' => true, // Views with their data
'route' => true, // Current route information
'auth' => false, // Display Laravel authentication status
'gate' => true, // Display Laravel Gate checks
'session' => true, // Display session data
'symfony_request' => true, // Only one can be enabled..
'mail' => false, // Catch mail messages
'laravel' => false, // Laravel version and environment
'events' => false, // All events fired
'default_request' => false, // Regular or special Symfony request logger
'logs' => false, // Add the latest log messages
'files' => false, // Show the included files
'config' => false, // Display config settings
'cache' => true, // Display cache events
'models' => true, // Display models
'livewire' => true, // Display Livewire (when available)
'jobs' => false, // Display dispatched jobs
'pennant' => true, // Display Pennant feature flags
],
/*
|--------------------------------------------------------------------------
| Extra options
|--------------------------------------------------------------------------
|
| Configure some DataCollectors
|
*/
'options' => [
'time' => [
'memory_usage' => false, // Calculated by subtracting memory start and end, it may be inaccurate
],
'messages' => [
'trace' => true, // Trace the origin of the debug message
],
'memory' => [
'reset_peak' => false, // run memory_reset_peak_usage before collecting
'with_baseline' => false, // Set boot memory usage as memory peak baseline
'precision' => 0, // Memory rounding precision
],
'auth' => [
'show_name' => true, // Also show the users name/email in the debugbar
'show_guards' => true, // Show the guards that are used
],
'db' => [
'with_params' => true, // Render SQL with the parameters substituted
'exclude_paths' => [ // Paths to exclude entirely from the collector
// 'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries
],
'backtrace' => true, // Use a backtrace to find the origin of the query in your files.
'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults)
'timeline' => false, // Add the queries to the timeline
'duration_background' => true, // Show shaded background on each query relative to how long it took to execute.
'explain' => [ // Show EXPLAIN output on queries
'enabled' => false,
],
'hints' => false, // Show hints for common mistakes
'show_copy' => true, // Show copy button next to the query,
'slow_threshold' => false, // Only track queries that last longer than this time in ms
'memory_usage' => false, // Show queries memory usage
'soft_limit' => 100, // After the soft limit, no parameters/backtrace are captured
'hard_limit' => 500, // After the hard limit, queries are ignored
],
'mail' => [
'timeline' => false, // Add mails to the timeline
'show_body' => true,
],
'views' => [
'timeline' => false, // Add the views to the timeline (Experimental)
'data' => false, //true for all data, 'keys' for only names, false for no parameters.
'group' => 50, // Group duplicate views. Pass value to auto-group, or true/false to force
'exclude_paths' => [ // Add the paths which you don't want to appear in the views
'vendor/filament' // Exclude Filament components by default
],
],
'route' => [
'label' => true, // show complete route on bar
],
'session' => [
'hiddens' => [], // hides sensitive values using array paths
],
'symfony_request' => [
'hiddens' => [], // hides sensitive values using array paths, example: request_request.password
],
'events' => [
'data' => false, // collect events data, listeners
],
'logs' => [
'file' => null,
],
'cache' => [
'values' => true, // collect cache values
],
],
/*
|--------------------------------------------------------------------------
| Inject Debugbar in Response
|--------------------------------------------------------------------------
|
| Usually, the debugbar is added just before </body>, by listening to the
| Response after the App is done. If you disable this, you have to add them
| in your template yourself. See http://phpdebugbar.com/docs/rendering.html
|
*/
'inject' => true,
/*
|--------------------------------------------------------------------------
| DebugBar route prefix
|--------------------------------------------------------------------------
|
| Sometimes you want to set route prefix to be used by DebugBar to load
| its resources from. Usually the need comes from misconfigured web server or
| from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97
|
*/
'route_prefix' => '_debugbar',
/*
|--------------------------------------------------------------------------
| DebugBar route middleware
|--------------------------------------------------------------------------
|
| Additional middleware to run on the Debugbar routes
*/
'route_middleware' => [],
/*
|--------------------------------------------------------------------------
| DebugBar route domain
|--------------------------------------------------------------------------
|
| By default DebugBar route served from the same domain that request served.
| To override default domain, specify it as a non-empty value.
*/
'route_domain' => null,
/*
|--------------------------------------------------------------------------
| DebugBar theme
|--------------------------------------------------------------------------
|
| Switches between light and dark theme. If set to auto it will respect system preferences
| Possible values: auto, light, dark
*/
'theme' => env('DEBUGBAR_THEME', 'auto'),
/*
|--------------------------------------------------------------------------
| Backtrace stack limit
|--------------------------------------------------------------------------
|
| By default, the DebugBar limits the number of frames returned by the 'debug_backtrace()' function.
| If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit.
*/
'debug_backtrace_limit' => 50,
];
+1 -1
View File
@@ -1,2 +1,2 @@
/*! For license information please see app.js.LICENSE.txt */
(()=>{var t,e={2110:(t,e,n)=>{"use strict";var o=Object.freeze({}),p=Array.isArray;function M(t){return null==t}function b(t){return null!=t}function c(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function z(t){return"function"==typeof t}function a(t){return null!==t&&"object"==typeof t}var i=Object.prototype.toString;function O(t){return"[object Object]"===i.call(t)}function s(t){return"[object RegExp]"===i.call(t)}function A(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function u(t){return b(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function l(t){return null==t?"":Array.isArray(t)||O(t)&&t.toString===i?JSON.stringify(t,null,2):String(t)}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function f(t,e){for(var n=Object.create(null),o=t.split(","),p=0;p<o.length;p++)n[o[p]]=!0;return e?function(t){return n[t.toLowerCase()]}:function(t){return n[t]}}var q=f("slot,component",!0),h=f("key,ref,slot,slot-scope,is");function W(t,e){var n=t.length;if(n){if(e===t[n-1])return void(t.length=n-1);var o=t.indexOf(e);if(o>-1)return t.splice(o,1)}}var v=Object.prototype.hasOwnProperty;function R(t,e){return v.call(t,e)}function m(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var g=/-(\w)/g,L=m((function(t){return t.replace(g,(function(t,e){return e?e.toUpperCase():""}))})),y=m((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),_=/\B([A-Z])/g,N=m((function(t){return t.replace(_,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var o=arguments.length;return o?o>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function T(t,e){e=e||0;for(var n=t.length-e,o=new Array(n);n--;)o[n]=t[n+e];return o}function B(t,e){for(var n in e)t[n]=e[n];return t}function C(t){for(var e={},n=0;n<t.length;n++)t[n]&&B(e,t[n]);return e}function w(t,e,n){}var S=function(t,e,n){return!1},X=function(t){return t};function x(t,e){if(t===e)return!0;var n=a(t),o=a(e);if(!n||!o)return!n&&!o&&String(t)===String(e);try{var p=Array.isArray(t),M=Array.isArray(e);if(p&&M)return t.length===e.length&&t.every((function(t,n){return x(t,e[n])}));if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(p||M)return!1;var b=Object.keys(t),c=Object.keys(e);return b.length===c.length&&b.every((function(n){return x(t[n],e[n])}))}catch(t){return!1}}function k(t,e){for(var n=0;n<t.length;n++)if(x(t[n],e))return n;return-1}function I(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}function D(t,e){return t===e?0===t&&1/t!=1/e:t==t||e==e}var P="data-server-rendered",U=["component","directive","filter"],j=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch","renderTracked","renderTriggered"],F={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:S,isReservedAttr:S,isUnknownElement:S,getTagNamespace:w,parsePlatformTagName:X,mustUseProp:S,async:!0,_lifecycleHooks:j},H=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function G(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}function Y(t,e,n,o){Object.defineProperty(t,e,{value:n,enumerable:!!o,writable:!0,configurable:!0})}var $=new RegExp("[^".concat(H.source,".$_\\d]"));var V="__proto__"in{},K="undefined"!=typeof window,Z=K&&window.navigator.userAgent.toLowerCase(),Q=Z&&/msie|trident/.test(Z),J=Z&&Z.indexOf("msie 9.0")>0,tt=Z&&Z.indexOf("edge/")>0;Z&&Z.indexOf("android");var et=Z&&/iphone|ipad|ipod|ios/.test(Z);Z&&/chrome\/\d+/.test(Z),Z&&/phantomjs/.test(Z);var nt,ot=Z&&Z.match(/firefox\/(\d+)/),pt={}.watch,Mt=!1;if(K)try{var bt={};Object.defineProperty(bt,"passive",{get:function(){Mt=!0}}),window.addEventListener("test-passive",null,bt)}catch(t){}var ct=function(){return void 0===nt&&(nt=!K&&void 0!==n.g&&(n.g.process&&"server"===n.g.process.env.VUE_ENV)),nt},rt=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function zt(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,it="undefined"!=typeof Symbol&&zt(Symbol)&&"undefined"!=typeof Reflect&&zt(Reflect.ownKeys);at="undefined"!=typeof Set&&zt(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var Ot=null;function st(t){void 0===t&&(t=null),t||Ot&&Ot._scope.off(),Ot=t,t&&t._scope.on()}var At=function(){function t(t,e,n,o,p,M,b,c){this.tag=t,this.data=e,this.children=n,this.text=o,this.elm=p,this.ns=void 0,this.context=M,this.fnContext=void 0,this.fnOptions=vLine truncated
(()=>{var t,e={2465:(t,e,n)=>{"use strict";var o=Object.freeze({}),p=Array.isArray;function M(t){return null==t}function b(t){return null!=t}function c(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function z(t){return"function"==typeof t}function a(t){return null!==t&&"object"==typeof t}var i=Object.prototype.toString;function O(t){return"[object Object]"===i.call(t)}function s(t){return"[object RegExp]"===i.call(t)}function A(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function u(t){return b(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function l(t){return null==t?"":Array.isArray(t)||O(t)&&t.toString===i?JSON.stringify(t,null,2):String(t)}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function f(t,e){for(var n=Object.create(null),o=t.split(","),p=0;p<o.length;p++)n[o[p]]=!0;return e?function(t){return n[t.toLowerCase()]}:function(t){return n[t]}}var q=f("slot,component",!0),h=f("key,ref,slot,slot-scope,is");function W(t,e){var n=t.length;if(n){if(e===t[n-1])return void(t.length=n-1);var o=t.indexOf(e);if(o>-1)return t.splice(o,1)}}var v=Object.prototype.hasOwnProperty;function R(t,e){return v.call(t,e)}function m(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var g=/-(\w)/g,L=m((function(t){return t.replace(g,(function(t,e){return e?e.toUpperCase():""}))})),y=m((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),_=/\B([A-Z])/g,N=m((function(t){return t.replace(_,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var o=arguments.length;return o?o>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function T(t,e){e=e||0;for(var n=t.length-e,o=new Array(n);n--;)o[n]=t[n+e];return o}function B(t,e){for(var n in e)t[n]=e[n];return t}function C(t){for(var e={},n=0;n<t.length;n++)t[n]&&B(e,t[n]);return e}function w(t,e,n){}var S=function(t,e,n){return!1},X=function(t){return t};function x(t,e){if(t===e)return!0;var n=a(t),o=a(e);if(!n||!o)return!n&&!o&&String(t)===String(e);try{var p=Array.isArray(t),M=Array.isArray(e);if(p&&M)return t.length===e.length&&t.every((function(t,n){return x(t,e[n])}));if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(p||M)return!1;var b=Object.keys(t),c=Object.keys(e);return b.length===c.length&&b.every((function(n){return x(t[n],e[n])}))}catch(t){return!1}}function k(t,e){for(var n=0;n<t.length;n++)if(x(t[n],e))return n;return-1}function I(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}function D(t,e){return t===e?0===t&&1/t!=1/e:t==t||e==e}var P="data-server-rendered",U=["component","directive","filter"],j=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch","renderTracked","renderTriggered"],F={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:S,isReservedAttr:S,isUnknownElement:S,getTagNamespace:w,parsePlatformTagName:X,mustUseProp:S,async:!0,_lifecycleHooks:j},H=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function G(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}function Y(t,e,n,o){Object.defineProperty(t,e,{value:n,enumerable:!!o,writable:!0,configurable:!0})}var $=new RegExp("[^".concat(H.source,".$_\\d]"));var V="__proto__"in{},K="undefined"!=typeof window,Q=K&&window.navigator.userAgent.toLowerCase(),J=Q&&/msie|trident/.test(Q),Z=Q&&Q.indexOf("msie 9.0")>0,tt=Q&&Q.indexOf("edge/")>0;Q&&Q.indexOf("android");var et=Q&&/iphone|ipad|ipod|ios/.test(Q);Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q);var nt,ot=Q&&Q.match(/firefox\/(\d+)/),pt={}.watch,Mt=!1;if(K)try{var bt={};Object.defineProperty(bt,"passive",{get:function(){Mt=!0}}),window.addEventListener("test-passive",null,bt)}catch(t){}var ct=function(){return void 0===nt&&(nt=!K&&void 0!==n.g&&(n.g.process&&"server"===n.g.process.env.VUE_ENV)),nt},rt=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function zt(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,it="undefined"!=typeof Symbol&&zt(Symbol)&&"undefined"!=typeof Reflect&&zt(Reflect.ownKeys);at="undefined"!=typeof Set&&zt(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var Ot=null;function st(t){void 0===t&&(t=null),t||Ot&&Ot._scope.off(),Ot=t,t&&t._scope.on()}var At=function(){function t(t,e,n,o,p,M,b,c){this.tag=t,this.data=e,this.children=n,this.text=o,this.elm=p,this.ns=void 0,this.context=M,this.fnContext=void 0,this.fnOptions=vLine truncated
+1 -1
View File
@@ -1,5 +1,5 @@
{
"/app.js": "/app.js?id=48ba33a2532e4b6ec718bc0f03b3f1e4",
"/app.js": "/app.js?id=99f84d421ae083196e0a45c3c310168b",
"/app-dark.css": "/app-dark.css?id=1ea407db56c5163ae29311f1f38eb7b9",
"/app.css": "/app.css?id=de4c978567bfd90b38d186937dee5ccf"
}
+2
View File
@@ -0,0 +1,2 @@
*
!.gitignore